单链表的删除
删除结点q,将它的前继结点的指针绕过,指向它的后继结点即可。
p->next=p->next->next,用p代替p->next
q=p->next;
p->next==q->next;
算法思路:
1.声明一指针p指向链表头指针,初始化j从1开始
2.当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1;
3.若到链表末尾p为空,则说明第i个结点不存在;
4.否则查找成功,将欲删除的结点p->next赋值给q;
5.单链表的删除标准语句p->next=q->next;
6.将q结点中的数据赋值给e,作为返回;
7.释放q结点;
8.返回成功。
实现代码算法如下
/*初始条件:顺序线性表L已存在,1<=i<=Listlength(L)*/
/*操作结果:删除L的第i个结点,并用e返回其值,L的长度减1*/
Status ListDelete(LinkList *L,int i,ElemType *e)
{
int j;
LinkList p,q;
p=*L;
j=1;
while (p->next&&j<i)
{
p=p->next;
++j;
}
if(!(p->next)||j>i)
return ERROR;
q=p->next;
p->next=q->next;
*e=q->data;
free(q);
return OK;
}
free 标准函数 系统回收一个Node结点,释放内存,与malloc相对应
单链表插入/删除算法//显示链式存储的优势,时间复杂度总是O(1)
1.遍历查找第i个结点
2.插入和删除结点
单链表的整表创建
动态生成链表的过程,即从“空表”的初始状态起,依次建立各元素结点,并逐个插入链表。
单链表整表创建的算法思路:
1.声明一指针p和计数器变量i;
2.初始化一空链表L;
3.让L的头结点的指针指向NULL,即建立一个带头结点的单链表;
4.循环:
生成一个新结点赋值给p
随机生成一数字赋值给p的数据域p->data
将p插入到头结点与前一新结点之间
实现代码算法
头插法
/*随机产生n个元素的值,建立带表头结点的单链线性表L(头插法)*/
void CreateListHead(LinkList *L/*链表名字是L*/,int n/*链表里有n个元素*/)
{
LinkList p;//
int i;
srand (time(0));//初始化随机数种子
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;//生成带头结点的单链表
for (i=0;i<n;i++)
{
p=((LinkList)malloc(siizeof(Node));//生成新结点
p->data=rand()%100+1;//数据域
p->next=(*L)->next;
(*L)->next=p;//插入到表头
}
}