vlambda博客
学习文章列表

单链表的各种操作整合(C语言版)

点击上方“蓝字”关注我
"

关于昨天的vs code C/C++环境配置要补充一点


就是MInGW 只能适配英文环境,


就是说文件保存路径、文件名、和里面的代码(除了注释)之外都是英文的


下载路径https://github.com/SDchao/AutoVsCEnv_WPF/releases/latest

复制到Chrome 或者Microsoft Edge 食用为佳

"


今日用了一下VS Code 写代码

确实比Visual Studio 和Code::Blocks舒服(但还是好累!)



今天的内容是:

单链表的各种操作的代码,整合成一个微小的程序

因为不能编译中文,所以有些句子就用英文勉强凑合hh



单链表是c语言入门的结业课

也是数据结构(c语言版)的 南天门


参考:刘畅主编,上海交通大学出版社出版的《数据结构(c语言版)》    


以及感谢王岚老师的帮助

中国移动

16:21

实名感谢



下面就开始源代码:


输出的风格是很辣眼睛

主要是掌握关键步骤

//单链表的应用,数上的应用程序;//线性表子系统#include <stdlib.h>#include<stdio.h>typedef int DateType;typedef struct Linknode{ DateType data; struct Linknode *next;}LinkList; //修改Linknode的名字;LinkList *InitList() //初始化单链表,把head设置为空内容{ LinkList *head; head=(LinkList*)malloc(sizeof(LinkList)); head->next=NULL; return head;}void CreatListH(LinkList *head,int n)//头插法创建单链表{ LinkList *s; int i; printf("Please input %d int numbers",n); for (i=0;i<n;i++) { s=(LinkList*)malloc(sizeof(LinkList)); scanf("%d",&s->data); s->next=head->next; //最重要的两步,需要仔细理解 head->next=s; //头插法的最终奥义是:头指针head始终处于最后一个输入的数据上 } printf("Success to create a LinkList!");}void CreateListL(LinkList *head,int n) //尾插法创建单链表{ LinkList *s,*tail; //因为head是不能移动的,所以需要引进一个tail指针一直存在数据的尾部 int i; tail=head; printf("Please input %d int numbers",n); for (i=0;i<n;i++) { s=(LinkList*)malloc(sizeof(LinkList)); scanf("%d",&s->data); s->next=NULL; //常常忽略,但很重要 tail->next=s; //尾插法的奥义是:链表后面始终加了个尾巴,而这个尾巴可以吸引(连接)新的数据进入链表中 tail=s; //尾巴一直都要在尾部. } printf("Success to create a LinkList!");}int LengthList(LinkList *head) //求链表的表长,挨个遍历一下,再计数就可以了{ LinkList *p=head->next; int j=0; while(p!=NULL) { p=p->next; j++; } return j;}void Locate(LinkList *head,DateType x) //输入元素的数据寻找元素的所在位置{ int j=1; LinkList*p; p=head->next; //由于需要一个一个遍历来查找,所以需要引进新的指针 while (p!=NULL && p->data!=x) //如果既没有找到,也没有找完 的时候进行循环遍历 { p=p->next; j++; } if(p!=NULL) //如果找到了 { printf("%d is in the list of %d position",x,j); } else //如果找完了,还没找到 { printf("I don't find the number of %d ",x); }}void SearchList(LinkList *head,int i) //寻找单链表某一个位置上面的元素数据。{ LinkList *p; //寻找就是要遍历,遍历就是要新指针 int j=0; p=head; if(i>LengthList(head)) //如果输入的位置,超出了链表的长度 { printf("fail to find,because the %d is more than the List Length!",i); } while(p->next!=NULL && j<i) //在没有找完和没有找到的情况下遍历 { p=p->next; j++; } if(j==i) //好不容易找到了 { printf("the position %d ,which number is %d",i,p->data); } else //找了半天找不到 { printf("fail to find!"); } }void InsertList(LinkList *head, int i ,DateType x) //插入一个元素{ int j=0; LinkList *p,*s; //还是,寻找位置需要遍历,遍历就要指针 p=head; while(p->next!=NULL && j<i-1) //插入的时候是需要找到插入位置的前一个结点,用来对接。 { //在位置不是末尾和位置前一个结点的情况下遍历 p=p->next; j++; } if(p!=NULL) //如果 ,这个位置的前一个结点不是空的(有的人输入一个超过链表长度+1的数值,就很离谱) { s=(LinkList*)malloc(sizeof(LinkList)); s->data=x; //把这个数据先放在s指针里面 s->next=p->next; //s后一个指针和s进行对接(尾巴对接) p->next=s; // 然后用前一个指针和后一个指针进行对接(脑子对接) printf("Success to insert!!"); } else  { printf("fail to insert!!"); }}void DeleteList(LinkList *head,int i) // 删除单链表某一个位置的操作{ int j=0; LinkList *s,*p; //s指针的目的是标定那个要删除的结点,p。。不想说了 DateType x; p=head; while (p->next!=NULL && j<i-1) //遍历,找到s前面那个结点 { p=p->next; j++; } if(p->next!=NULL && j==i-1) //已经到了那个位置,p的目的是标定s前面的一个结点 { s=p->next; //把p后面的一个结点定义为s指针 x=s->data; //储存一下s指针里面的值 p->next=s->next; //p指针和s后面的那个指针对接 free(s); //s没有用了,要释放掉 printf("success to delete the postion of %d statistic %d",i,x); } else { printf("fail to delete ,because the position is fault!"); }  }void Display(LinkList *head) // 打印单链表的数值{ LinkList *p; p=head->next; //遍历单链表,依次输出,没难度 while(p!=NULL) { printf("%6d",p->data); p=p->next; }}void MenuLine() //及其不好看的菜单门面{ printf("\n THE LIST OF APPLICATION"); printf("\n======================================================================"); printf("\n| 1 BUILD A LIST |"); printf("\n| 2 INSERT A NUMBER |"); printf("\n| 3 DELETE A NUMBER |"); printf("\n| 4 FIND BY POSITION |"); printf("\n| 5 FIND BY DATA |"); printf("\n| 6 LENGTH OF LIST |"); printf("\n| 0 BACK |"); printf("\n======================================================================"); printf("\n YEZIPENG TO DO \n");}int main(){ LinkList *head; DateType x; int i,n; char ch1,ch2,a; ch1='y'; while(ch1=='y'||ch1=='Y') //如果输入的是y,那,快活 { MenuLine(); scanf("%c",&ch2); // 这就是0~6随便输 getchar(); switch(ch2) { case '1': head=InitList(); printf("please input the length number of List:"); scanf("%d",&n); CreateListL(head,n); printf("The end of List is :\n"); Display(head); break; case '2': printf("Please input which position would you want to insert:"); scanf("%d",&i); getchar(); printf("How much would you want to insert"); scanf("%d",&x); InsertList(head,i,x); printf("The end of List is :\n"); Display(head); break; case '3': printf("Please input which position would you want to delete:"); scanf("%d",&i); DeleteList(head,i); printf("The end of List is :\n"); Display(head); break; case '4': printf("Please input which position would you want to find:"); scanf("%d",&i); SearchList(head,i); printf("The end of List is :\n"); Display(head); break; case '5': printf("Please input the number of int you want to find :"); scanf("%d",&x); Locate(head,i); break; case '6': printf("the List of Length is %d\n",LengthList(head)); break; case '0': ch1='n'; break; default: printf("fail to input ,change it "); //有的人居心叵测,输入不对,想浪费内存
} if(ch2!='0') // { printf("\npress Enter is keep on,and you can press any other button to out\n"); a=getchar(); //输入一个。。回车或其他 if(a!='\xA') //换行的ASCII码是10,就相当于是回车 { getchar(); ch1='n'; //不按回车,咱就结束 } } }}


247行代码

写了俩小时


加油

欢迎大家私信我一起探讨问题

  

我的Popi:

https://www.popiask.cn/7QZ4Ms

进入这个网站后,你所有的提问都将是匿名的



更多精彩推荐,请关注我