以下链表均为带头结点的单链表
一.单链表类型的的声明
typedef struct Node{//声明一个存储整形数据的单链表类型
int data;
struct Node *next;
}Node,*LinkList;
二.创建单链表——头插法
void CreateListHead(LinkList *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(sizeof(Node));//生成新节点
p->data=rand()%100+1;//随机生成100以内的数字、
p->next=(*L)->next;
(*L)->next=p;
}
}
创建单链表——尾插法
void CreateLinstTail(linklist *L,int n){//尾插法创建有n个节点的单链表
linklist r,p;//r指向为节点,p生成新节点
int j;
srand(time(0));
(*L)=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
for(j=0;j<n;j++)
{
r=*L;
p=(Node*)malloc(sizeof(Node));//生成一个新节点
p->data=rand()%100+1//随机生成100以内的数字
r->next=p;
r=p;
}
r->next=NULL;
}
三.单链表的整表删除
Status ClearLinst(LinkList *L){//清空一个单链表
LinkList p,q;/*将第一个节点赋值给p,循环执行;1将下一节点赋值给q,2释放p,3将q赋值给p*/
p=(*L)->next;//p指向了第一个节点
while(p!=NULL)//没到表尾
{
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL;//头结点指针域为空
return ok;
}
四.读取单链表第i个元素
Status GetElem(linkList L,int i,int *e){//读取链表L中第i个元素,并用e返回,假设线性表L已经存在,1<=i<=listlength(L)
int j;
linklist p;//声明一节点p
p->L-next;//p指向头结点
j=1;//j为计数器
while(p&&j<i)//p不为空并且j还没到i时 执行循环
{
p=p->next;
j++;
}
if(!p||j>i)
return error;
*e=p->data;
return ok;
}
五.单链表的插入
status LinkListInsert(Linklist *L,int i,int e;){//需要改变一级指针指向,故函数形参用二级指针
int j;
LinkList p,s;
p=*L;
j=1;
while(p&&j<i){//寻找第i个结点
p=p->next;
j++;
}
if(!p||j>i){
return error;//第i个元素不存在
}
s=(LinkList)malloc(sizeof(Node));//生成一个Node类型的结点,并用s指向它
s->data=e;
s->next=p->next
p->next=s;//在第i个结点后插入s
return ok;
}
六.单链表的删除
status LinkListdel(LinkList *L,int i,int *e){//删除第i个结点,并用e接收
Linklist p;//定义工作指针
p=(*L)->next//p指向第一个结点
int j=1;//计数器置1
while(p->next&&j<i-1){//未找到第i-1个元素,循环继续
p=p->next;
j++;
}
if(!p||j>i-1)//找不到第I个结点,无法删除
return error;
*e=p->next->data;
LinkList q=p->next;
p->next=q->next;
free(q);
return ok;
}