尾插法
一开始头指针和尾指针都指向头结点,然后往里边插入元素,
每插入一个元素尾指针就后移一下,现在我们的尾指针就指向我们链表中最后一个结点了
现在我们开始插入一个新的节点,怎么做呢?
我们需要从内存找到一块相应的空间,然后将这个空间的地址存储在,指针变量p当中,这个情况,就称作p指向我们的元素的新节点
然后我们将新节点的数据域插入我们想要插入的元素,然后将他的指针域设置为空
然后使用尾插法将这个节点插入到我们的链表当中去
实际上就是给元素的最后一个节点的指针域赋值,赋值谁呢,,,
赋值的值就是我们的p指针所指向的新节点的地址,把p指针变量所指向的节点的地址赋值给前一个我们想插入的节点的指针域(尾指针所指向的next域),
就是我们新节点所赋值的域
简而言之,言而简之,就是分三步
开辟新空间,
数据域赋值我们想要插入的数据,指针域为空,指针变量p指向新节点的地址,
然后用链表的尾指针指向新的节点的地址,
最后将新建的空间地址的指针变量的值赋值给前尾指针的地址,尾指针指向的地址就变成了新插入节点的地址
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next; //指向后继结点
} LinkNode;
void CreateListR(LinkNode *&L, ElemType a[], int n)
{ int i;
LinkNode * s,*r;
L = (LinkNode *)malloc(sizeof(LinkNode));
r=L;
for(i=0;i<n;i++)
{
s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = a[i];
r->next = s;
r=s;
}
r->next=NULL;
}
void DispList(LinkNode *L){
LinkNode *p = L->next; //p指向首节点
while(p != NULL){ //p不为NULL,输出p节点的data
printf("%d ", p->data);
p = p->next; //p移向下一个节点
}
printf("\n");
}
int main()
{
LinkNode *h;
ElemType a[10]={0,1,2,3,4,5,6,7,8,9};
CreateListR(h,a,10);
DispList(h);
return 0;
}
上述算法里,动态申请新结点空间时未加错误处理,这对申请空间极少的程序而言不会出问题。但在实用程序里,尤其是对空间需求较大的程序,凡是涉及动态申请空间,一定要加入错误处理以防系统无空间可供分配。