C语言中实现链表,是需要利用到C语言中比较难的结构体与指针才能实现。
结构体中放一个指向后接节点的指针与每一个结点应该存放的信息。
下面做一个命令行的通讯录来说明链表的增删改查这个问题。
一开始让用户输入链表,按1可以输出,按3可以删除。
可以修改:
可以插入。
按0则可以退出:
代码如下:
#include<stdio.h> #include<stdlib.h> typedef struct Linklist{ char name[10];//存放名字 char num[10];//存放电话号码 struct Linklist *next; }Linklist,*LNode; //创建链表 void create(Linklist *L){ char flag='y'; Linklist *p,*s; p=L; puts("创建一个通讯录:"); while(flag=='Y'||flag=='y'){ //初始化生成块 s=(LNode)malloc(sizeof(Linklist)); printf("姓名:"); scanf("%s",s->name); printf("号码:"); scanf("%s",s->num); //尾插法核心语句开始 s->next=NULL;//注意封口 p->next=s; p=s; //尾插法核心语句结束 //吃换行符 getchar(); printf("继续输入?(y/n)"); scanf("%c",&flag); } } //输出链表 void output(Linklist *L){ Linklist *p; p=L->next; puts("编号\t姓名\t号码");//表头 puts("====\t====\t====");//华丽的分割线 int count=1; while(p){ printf("%d\t%s\t%s\n",count,p->name,p->num); p=p->next; count++; } } //修改链表中的某一项 void update(Linklist *L){ Linklist *p; p=L; int n; puts("需要修改哪一项?"); scanf("%d",&n); for(int i=1;i<n+1;i++){ p=p->next;//把指针移位到需要修改的一项 } if(p==NULL){ puts("没有这项!"); } else{ printf("姓名:"); scanf("%s",p->name); printf("号码:"); scanf("%s",p->name); } } //在链表尾部插入一项 void insert(Linklist *L){ Linklist *p,*s; p=L; while(p->next){//尾插法,直接把指针移位到尾部 p=p->next; } //初始化生成块 s=(LNode)malloc(sizeof(Linklist)); printf("姓名:"); scanf("%s",s->name); printf("号码:"); scanf("%s",s->num); //尾插法核心语句开始 s->next=NULL;//注意封口 p->next=s; //只插入一项,无须p=s //尾插法核心语句结束 } //在链表中删除一项 void del(Linklist *L){//不写delete是因为delete是C语言的关键字 Linklist *p,*q; p=L; int n; puts("需要删除哪一项?"); scanf("%d",&n); //这里的指针定位不同于修改,我们需要把指针定位到要删除的前一项,进行删除 for(int i=1;i<n;i++){ p=p->next; } if(p==NULL){ puts("没有这项!"); } else{//删除的核心语句 q=p->next; p->next=q->next; free(q); } } void main(){ Linklist *L; int i=255; L=(LNode)malloc(sizeof(Linklist));//熟记malloc的用法,词句为开创一个长为Linklist的空间,而后被L所指向 L->next=NULL;//此处头结点的尾指针必须封口,否则不同的编译器会编译出不同的成分。 create(L); while(i!=0){ puts("\n功能:\n1.输出\t2.修改\t3.删除\t4.插入\t0.退出"); scanf("%d",&i); switch(i){ case 1: output(L); break; case 2: update(L); break; case 3: del(L); break; case 4: insert(L); break; } } }
其实也不难,
链表的增加采用尾插法,先开辟一个结点空间,用一个指针所指,把操作的指针移到结点的最后,连接新开辟的结点
删除一项先把指针移到要删除的项之前,再用一个指针移到要删除的项,删除完毕,把前一项的后接指针移到下两项
查询、修改最简单,只是一个单纯的指针移动过程。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/yongh701/article/details/47341151