插入节点操作:
x节点要插入到a节点后面,可以先将s指向要插入的x结点,p指向a节点
然后让x节点的next指针域指向a节点的后继节点,转换成代码就是:s->next = p->next。
然后让a节点的next指针域指向x节点,即p->next = s,完成插入元素操作。
我们发现整个插入元素操作只需要两步就可以完成:
s->next = p->next;
p->next = s;
注意:在进行插入元素操作时,需要先循环查找到要插入的节点的前驱节点的位置,再进行插入元素操作。
删除节点操作:
q = p->next; //记录要删除的节点
p->next = q->next; //p指向的节点指向要删除的节点的后继节点
free(q); //释放要删除的节点空间
删除节点元素时,需要先循环找到要删除的节点的前驱节点的位置,然后再定义一个临时的指针q指向要删除的节点,然后更新p指向的节点的指针域,指向要删除的节点的后继节点,再删除节点。
头插法建表:
创建一个空表,然后将a,b,c,d这几个数据依次插入到链表的表头中。完成后链表中的节点插入顺序和实际的物理顺序是相反的。
void CreateListF(LinkList *&L,ElemType a[],int n)
{
LinkList *s;
int i;
//创建链表头结点
L=(LinkList *)malloc(sizeof(LinkList));
//第一次头结点指向为NULL
L->next=NULL;
//然后把新节点插入到表头中
for (i=0; i<n; i++)
{
//分配新节点的存储空间
s=(LinkList *)malloc(sizeof(LinkList));
//把数组中的数据拷贝到新节点中
s->data=a[i];
//然后把新节点插入到表头中
s->next=L->next;
//头结点指向新节点
L->next=s;
}
}
尾插法建表:
尾插法一般就是将新节点插到当前链表的表尾上。
第一次:把a节点插入到链表的尾部,完成后a节点就是尾节点了
第二次:把d节点插入到链表的尾部,完成后d节点就是尾节点了
第三次:把c节点插入到链表的尾部,完成后c节点就是尾节点了
第四次:把b节点插入到链表的尾部,完成后b节点就是尾节点了
当尾插法建表完成后,节点在逻辑上的插入顺序和实际的物理顺序是相同的。
尾插法实现:
void CreateListR(LinkList *&L,ElemType a[],int n)
{
//注意:需要再定义一个尾指针r,始终指向链表的尾节点
LinkList *s,*r;
int i;
//创建链表头结点,注意L是作为头结点,位置不能变
L=(LinkList *)malloc(sizeof(LinkList));
//第一次先让r指向头结点L
r=L;
//然后开始在尾节点插入
for (i=0; i<n; i++)
{
//分配新节点的空间
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
//把新节点s插入到链表尾部
r->next=s;
//更新尾指针r,指向新节点s
r=s;
}
//插入完毕后,把尾节点的指针域置为NULL
r->next=NULL;
}