单链表的增加和删除,数据结构单链表的增删改查
伊德斯干货盘点
@TOC
1.链表的概念
一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针连接次序实现的。
2.链表优点
1.空间上按需所给空间
2.在头部和中间插入时,不需要挪动数据
二~我爱你~单链表的实现
1.函数的定义和结构体的创建——名单h
#包括标准视频
#包括标准库
#include assert.h包含断言
typedef int slistdatatype:
typedef结构slistnode类型定义结构滑动节点
slistdatatype数据
结构s*下一步;
} slistnode
void stack push back(slist node * * PP head,slist data type x);
void slist print(slist node * phead);
void堆栈弹出返回(slist节点* * phead);
void stack push Fran(slist node * * phe ad,slist data type x);
void stack pop front(slist node * * phead);
slist node * slist ind(slist node * ph EAD,slist ATA type x);
S7-1200可编程控制器:
参见slistnode**pphead,slistnode * pos
2.函数的调用前334年
#包括list.h
int main()
slistnode * phead=null
stackpushback( phead,1);//尾插
堆栈推回(phead,2);
堆栈推回(phead,3);
stackpushback( phead,4);
slist打印(phead);//打印
堆栈弹出返回(phead);//尾删
slist打印(phead);
堆栈pushfran(phead,5);//头插
slist打印(phead);
堆栈弹出前端(phead);//头删
slist打印(phead);
slist node * pos 1=slist ind(ph head,2);//查找位置
slistinserafter(phead,位置1.6);//指定插
slist打印(phead);
slist node * pos 2=slist ind(ph head,2);
滑动aseafter(phead,位置2);//指定删
slist打印(phead);
返回0;
}
3.二级指针问题
此时发现传过去的佩哈德,接收是二级指针,传址调用才能真正改变主函数中菲德指针
但比如打印或者查找位置并没有改变菲德指针,所以也就不用传地址了
4.单链表的接口实现
void堆栈推回(slistnode * * pphead,slistdatatype x/)尾插
slist节点* new节点=(slist节点*)malloc(sizeof节点));
if (newnode!=空)
newnode- data=x:
newnode- next=NULL:
if(* pphead==null)/(s)为空时
* pphead=newnode
else//不为空时
slistnode * tail=* pphead
而(尾部-下一个!=null//遍历到最后一个节点
尾部=尾部-下一个:
尾部-下一个=新节点:
}
参见堆栈弹出返回(滑动节点* * pphead/)尾删
if(* pphead==null)/(s)为空
返回;
else if ((*pphead)-下一个==null/)只有一个节点时
自由(* PP head);
*pphead=NULL:
else//正常情况下要把尾节点免费的尾节点的前一个节点的指针置为空值
slistnode* prev=NULL://预测指向前一个节点
slistnode * tail=* pphead
而(尾部-下一个!=空)
上一次=尾部:
尾部=尾部-下一个:
自由(尾部);
尾部=空:
prev- next=NULL:
}
void stack push Fran(slist node * * PP head,slistdatatype x/)头插
slist节点* new节点=(slist节点*)malloc(sizeof节点));
newnode- data=x:
newnode- next=NULL:
new node-next=* PP head;
* pphead=newnode
}
参见堆栈弹出前端(滑动节点* * pphead/)头删
if(* pphead==null)/(s)若为空
返回;
其他语句
slist节点* new节点=(slist节点*)malloc(sizeof节点));
newnode=(*pphead)-下一步;/*pphead的后一个节点作为*pphead
自由(* PP head);
*pphead=NULL:
* pphead=newnode
}
5.查找位置
slist node * slist ind(slist node * phead,slist atatype x)/(s查找位置(返回该位置,不是下标)
slistnode * cur=phead
而(当前值!=空)
if (cur- data==x)
返回当前值;//如果找到了则返回该位置
cur=cur-next;
返回NULL://没找到直接返回空值
}
6.指定插
请参见slistnode** pphead、slistnode* pos、slist数据类型x//指定插
断言(pos);//位置为找到的位置,x是要插入的值
slist节点* new节点=(slist节点*)malloc(sizeof节点));
newnode- data=x:
newnode- next=NULL:
newnode- next=pos- next://先将新节点与位置(p)后面的节点连接
pos-next=新节点;//再将位置(p)与新节点连接
}
这里一定不要先将位置(p)与x个先连接,否则会使下一个位置找不到2
7.指定删
参见slistnode** pphead,slistnode * pos指定删
断言(位置);//pos可以传递NULL。
slistnode * prev=* pphead
while(上一页-下一页!=pos)//prev是pos的上一个节点。
prev=prev-next;
prev-next=pos-next;//连接pos的前一个节点和后一个节点
免费(pos);
pos=NULL
}
void slist print(slist node * phead)//print
slistnode * cur=phead
而(cur!=空)
printf(%d-,cur-data);
cur=cur-next;
printf( NULL \ n );
}
。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。