下面的代码是我初学链表时自己整理出来的。包含:1.链表的创建、2.按值删除节点、3.按位置删除节点、4.插入一个元素、5.求链表的长度、6.显示链表中所有元素,六个函数。因为是初学,所以代码有不足之处,希望大家不吝赐教。也希望对如我一样的初学者有所帮助。
#include <stdio.h>
#include <malloc.h>
#include <windows.h>
#include <conio.h>
typedef struct node
{
int data;
struct node *next;
}NODE,*LINK;
void Print()
{
printf("1.creat a link/n");
printf("2.delete a data by worth/n");
printf("3.delete a data by location/n");
printf("4.insert a data/n");
printf("5.show link's longth/n");
printf("6.list datas in link/n");
printf("7.exit/n");
printf("goto:");
}
int Longth(LINK head) //求链表的长度
{
int cnt=0;
LINK p=head->next;//初始化p,令其指向首元节点
while(p) //当p所指向的节点存在(此处与p非空等价)
{
cnt++; //计数器自加1
p=p->next; //让p指向下一节点
}
return(cnt); //返回链表长度
}
LINK Creat()//创建链表
{
LINK head,p,r; //定义头指针head,用于创建节点的指针p和尾指针r
int x;
r=head=(LINK)malloc(sizeof(NODE));//创建头节点,让头、尾指针均指向它
printf("Enter integer datas,end by -1,sepated with space/n");
scanf("%d",&x);
while(x!=-1)
{
p=(LINK)malloc(sizeof(NODE));//创建新节点,让p指向它
p->data=x; //给p指向的节点的数据域赋值为x
r->next=p; //让前一节点的指针指向新生成节点
r=p; //移动尾指针
scanf("%d",&x);
}
p->next=NULL; //给最后一个节点的指针域赋值为空
return(head); //返回生成链表的头指针
}
void Del1(LINK head,int x) //按数据域值删除节点
{
LINK p,q=head;
p=head->next; //p指向首元节点
while(p && p->data!=x)//若p指向节点存在且其数据域值!=x,则移动指针
{
q=p; //q指向待删除节点的前一节点
p=p->next;
}
if(!p) //若p为空则没有找到数据域值为x的节点
printf("NO FIND DATA %d/n",x);
else //否则
{
q->next=p->next; //让前一节点指针指向待删除节点指针指向的节点
free(p); //释放待删除节点
printf("COMPLETE/n");
}
}
void Del2(LINK head,int i) //按位置删除节点
{
LINK p,q=head;
int j,Lmax;
Lmax=Longth(head);
if(i<1 || i>Lmax) //若给出删除位置在[1,Lmax]以外,这位置非法
printf("WRONG LOCATION/n");
else
{
p=head->next; //p指向首元节点
for(j=1;j<i;j++);
{
q=p;
p=p->next;
} //找到待删除节点的前一节点,并让q指向它;p指向待删除节点
q->next=p->next;//让前一节点指针指向待删除节点指针所指向的节点
free(p); //释放待删除节点
printf("COMPELTE/n");
}
}
void Insert(LINK head,int i,int x) //在链表的i位置插入数据域值为x的节点
{
LINK q=head,p,c;
int j,Lmax;
Lmax=Longth(head); //求出链表长度
if(i<1 || i>Lmax+1) //插入位置i须在[1,Lmax+1]之间否则位置非法
printf("WRONG LOCATION/n");
else
{
p=head->next; //p指向首元节点
c=(LINK)malloc(sizeof(NODE));//创建新节点,让c指向它
c->data=x; //给c指向的新节点的数据域赋值为x
for(j=1;j<i;j++)
{
q=p;
p=p->next;
}//找到待插入位置前一位置,让q、p分别指向前一节点和本节点
q->next=c; //让前一节点的指针指向新节点
c->next=p; //让新节点的指针指向本节点
printf("COMPLETE/n");
}
}
void List(LINK head) //列出链表中每个节点数据
{
LINK p=head->next; //初始化p,令其指向链表的首元节点
while(p) //当p所指向的节点存在
{
printf("%d ",p->data); //输出p所指向的节点的数据域值
p=p->next; //p指向下一节点准备输出下一节点的数据域值
}
printf("/n");
}
void Quit()
{
exit(0);
}
void main()
{
char c;
LINK head;
int x,i;
while(1)
{
Print();
c=getch();
printf("/n");
switch(c)
{
case '1':head=Creat();break;//创建链表
case '2':
printf("delete data:");scanf("%d",&x);Del1(head,x);break;//按值删除链表中的一个节点
case'3':
printf("deletedata'slocation:");scanf("%d",&i);Del2(head,i);break;//按位置删除节点
case'4':
printf("insertdata'slocation:");scanf("%d",&i);printf("insertdata:");scanf("%d",&x);Insert(head,i,x);break;//插入一个节点
case '5':printf("%d/n",Longth(head));break;//求链表的长度
case '6':List(head);break;//列出链表中每个节点数据
case '7':Quit();//退出程序
}
}
}
运行环境:vc++
若需要本段代码上机运行,请先将其拷贝到word中删除函数名的下划线。