一步一步学链表

开始写链表了,xiaod年前都已经实现了,我到现在还迟迟没有实现,表示十分尴尬,好吧,这两天把它给搞定!!

首先是基本框架
1. 录入链表
2. 插入一个元素
3. 删除一个元素
4. 遍历链表,输出所有
5. 链表排序
6. 退出
看了一下资料,了解了不少,写了基本框架,今天先把录入和输出给实现了吧!

先把代码贴出来:

首先是主函数:

#include <stdio.h> #include <stdlib.h> #define NULL 0 typedef struct Node{ int Data; Node *next; }Node; int main() { int where,select,back; Node *L; while(1) { system("color 1c"); system("cls"); back=0; select=front(); //主屏函数 switch(select) { case 1:L=Build();break; //创建链表 case 2:printf("开发中……\n");break; case 3:printf("开发中……\n");break; case 4:Show(L);break; //遍历链表 case 5:back=1;break; } if(back) break; } return 0; }


然后是主屏函数函数:

int front() //显示主屏 { int opt; printf("***************************************\n"); printf(" 1.录入一个新链表\n"); printf(" 2.插入一个元素\n"); printf(" 3.删除一个元素\n"); printf(" 4.显示当前链表内元素\n"); printf(" 5.退出\n"); printf("***************************************\n"); printf("请选择:[ ]\b\b"); scanf("%d",&opt); return opt; }


其次是创建链表函数:

1.头插法:

Node *Build() //创建链表函数 { system("cls"); int n; printf("请输入链表结点个数:[ ]\b\b\b"); scanf("%d",&n); Node *M, *N, *L; L=( Node*)malloc(sizeof(Node)); //开辟内存 M=( Node*)malloc(sizeof(Node)); printf("请输入%d个数字,以空格隔开:\n",n); scanf("%d",&M->Data); M->next=NULL; L->next=M; for(int i=1;i<n;i++) { N=( Node*)malloc(sizeof(Node)); scanf("%d",&N->Data); N->next=NULL; M->next=N; M=N; } return L; }

2.尾插法

Node *Build() //创建链表函数 { system("cls"); int n; printf("请输入链表结点个数:[ ]\b\b\b"); scanf("%d",&n); Node *N, *L; L=( Node*)malloc(sizeof(Node)); printf("请输入%d个数字,以空格隔开:\n",n); L->next=NULL; for(int i=1;i<=n;i++) { N=( Node*)malloc(sizeof(Node)); scanf("%d",&N->Data); N->next=L->next; L->next=N; } return L; }


然后是遍历函数:

void Show(Node *L) //遍历函数 { printf("当前链表为:\n"); int a=0; L=L->next; while(L) { a++; printf("%d:%d\n",a,L->Data); L=L->next; } system("PAUSE"); }

好吧,先写到这里,一会再把后面的部分写出来。写一下博客,思路清晰多了,嘿;嘿……大笑


插入函数:

void Inset(Node* L) //在链表中一个插入元素 { system("cls"); Node *M; int a; printf("请确定你要插入的结点位置:"); scanf("%d",&a); for(int i=1;i<a;i++) L=L->next; M=( Node*)malloc(sizeof(Node)); printf("请输入你要插入的元素:"); scanf("%d",&M->Data); M->next=L->next; L->next=M; }


删除函数:

void Delete(Node* L) //删除函数 { Node* M; M=( Node*)malloc(sizeof(Node)); int n,temp=1; printf("请确定你要删除的元素:"); scanf("%d",&n); L=L->next; while(L) { if(L->Data==n) { M->next=L->next; temp=0; printf("删除成功!\a\n"); break; } M=L; L=L->next; } if(temp) printf("元素不存在!!\a\n"); system("PAUSE"); }


退出函数:

int Exit(Node* L) //退出函数 { int n; Node* M; printf("是否退出?1.是/2.否[ ]\b\b"); scanf("%d",&n); if(n==2) return 0; L=L->next; while(L) { M=L; L=L->next; free(M); //释放内存 } return 1; }


呜~~~~~~终于搞定了,不过那个排序的算法没有写,太麻烦了,宋牛说不用写,以后如果真用的话,就用结构体,爽呆了!!

现在把我的整体结果给贴出来吧,哈哈!得意

这是头插法的:

#include <stdio.h> #include <stdlib.h> #define NULL 0 typedef struct Node{ int Data; Node *next; }Node; Node *Build() //创建链表函数 { system("cls"); int n; printf("请输入链表结点个数:[ ]\b\b\b"); scanf("%d",&n); Node *M, *N, *L; L=( Node*)malloc(sizeof(Node)); M=( Node*)malloc(sizeof(Node)); printf("请输入%d个数字,以空格隔开:\n",n); scanf("%d",&M->Data); M->next=NULL; L->next=M; for(int i=1;i<n;i++) { N=( Node*)malloc(sizeof(Node)); scanf("%d",&N->Data); N->next=NULL; M->next=N; M=N; } return L; } void Show(Node *L) //遍历函数 { printf("当前链表为:\n"); int a=0; L=L->next; while(L) { a++; printf("%d:%d\n",a,L->Data); L=L->next; } system("PAUSE"); } void Inset(Node* L) //在链表中一个插入元素 { system("cls"); Node *M; int a; printf("请确定你要插入的结点位置:"); scanf("%d",&a); for(int i=1;i<a;i++) L=L->next; M=( Node*)malloc(sizeof(Node)); printf("请输入你要插入的元素:"); scanf("%d",&M->Data); M->next=L->next; L->next=M; } void Delete(Node* L) //删除函数 { Node* M; M=( Node*)malloc(sizeof(Node)); int n,temp=1; printf("请确定你要删除的元素:"); scanf("%d",&n); L=L->next; while(L) { if(L->Data==n) { M->next=L->next; temp=0; printf("删除成功!\a\n"); break; } M=L; L=L->next; } if(temp) printf("元素不存在!!\a\n"); system("PAUSE"); } int Exit(Node* L) //退出函数 { int n; Node* M; printf("是否退出?1.是/2.否[ ]\b\b"); scanf("%d",&n); if(n==2) return 0; L=L->next; while(L) { M=L; L=L->next; free(M); //释放内存 } return 1; } int front() //显示主屏 { int opt; printf("***************************************\n"); printf(" 1.录入一个新链表\n"); printf(" 2.插入一个元素\n"); printf(" 3.删除一个元素\n"); printf(" 4.显示当前链表内元素\n"); printf(" 5.退出\n"); printf("***************************************\n"); printf("请选择:[ ]\b\b"); scanf("%d",&opt); return opt; } int main() { int where,select,back; Node *L; L=( Node*)malloc(sizeof(Node)); L->next=NULL; while(1) { system("color 1c"); system("cls"); back=0; select=front(); switch(select) { case 1:L=Build();break; //建立 case 2:Inset(L);Show(L);break; //插入 case 3:Delete(L);break; //删除 case 4:Show(L);break; //遍历 case 5:back=Exit(L);break; //退出 } if(back) break; } return 0; }


运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值