链表基本操作

 

下面的代码是我初学链表时自己整理出来的。包含: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;

              }//找到待插入位置前一位置,让qp分别指向前一节点和本节点

              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中删除函数名的下划线。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值