C语言数据结构_链表插入结点或删除结点
向链表插入结点
1、先创建一个新结点,并用指针p指向该结点
2、将q指向结点的next域的值(即q的后继结点的指针)赋值给p指向结点的next域
3、将p的值赋值给q的next域
void insertList(LinkList *list ,LinkList q, ElemType e){
//向链表中由指针q指出的结点后面插入结点,结点数据为e
LinkList p;
p= ( LinkList)malloc(sizeof(LNode) ); //生成一个新结点,由p指向它
p->data=e; //向该结点的数据域赋值e
if(!*list){
*list=p;
p->next=NULL;
}
else{
p->next=q->next;
//将q指向的结点的next域的值赋值给p指向结点的next域
q->next=p;
//将p的值赋值给q的next域
}
}
上面代码描述了如何在指针q指向的结点后面插入结点的过程。
1、首先生成一个新的结点,大小为sizeof(LNode),用LinkList类型的变量p指向该结点。将该结点的数据域赋值为e。
2、接下来判断链表是否为空。如果链表为空,则将p赋值给list,p的next域的值置为空。否则,将q指向的结点的next域的值赋值给p指向结点的next域,这样p指向的结点就与q指向结点的下一个结点连接到了一起。
3、然后再将p的值赋值给q所指结点的next域,这样就将p指向的结点插入到了指针q指向结点的后面。
从链表中删除结点
从链表中删除结点的3种情形:
1、q所指向的是链表的第一个结点
2、q所指向的结点的前驱结点的指针已知
3、q所指向的结点的前驱结点的指针未知
第1,2种情形可以用下面代码描述:
void delLink(LinkList *list, LinkList r, LinkList q){
if (q == *list)
*list=q->next; //适用于情形一
else
r->next=q->next; //适用于情形二
free(q);
}
第3种情形使用下面代码进行处理:
//当q所指向的结点的前驱结点的指针未知时,需要先通过链表头指针list遍历链表,找到q的前驱结点的指针,并将该指针赋值给指针变量r,再按照第二种情形去做
void delLink(LinkList *list, LinkList q) {
LinkList r;
if(q == list){
*list=q->next;
free(q);
}
else {
for(r=*list; r->next != q; r= r->next); //遍历链表,找到q的前驱结点的指针
if(r->next != NULL){
r->next = q -> next;
free(q);
}
}
}