一步一步学链表

开始写链表了,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; }


运行结果:

### 关于链表数据结构习指南 #### 什么是链表链表是一种动态数据结构,其特点在于它使用一组任意的存储单元(可以是连续的,也可以是非连续的)来存放数据元素[^2]。数组不同的是,链表并不依赖固定的内存空间大小,而是通过指针将各个节点连接起来。 #### 链表的基本组成 每个链表中的元素被称为“结点”,而每个结点通常由两部分构成: - **数据域**:用于保存实际的数据值。 - **指针域**:指向下一个结点的位置。如果当前结点为链表的最后一项,则该指针域为空(`NULL`),表明链表到此为止结束[^2]。 #### 单链表的实现方式 以下是基于 Java 的单链表基本实现方法: ```java public class MySingleLinkedList { // 定义内部节点类 static class ListNode { public int val; public ListNode next; public ListNode(int val) { this.val = val; this.next = null; // 初始化时设置next为null } } public ListNode head; // 头节点初始化为null // 创建链表的方法 public void createList() { ListNode node1 = new ListNode(10); ListNode node2 = new ListNode(20); ListNode node3 = new ListNode(30); // 将各节点链接在一起 node1.next = node2; node2.next = node3; // 设置head为首节点 this.head = node1; } // 打印链表内容以便验证 public void printList() { ListNode current = head; while (current != null) { System.out.print(current.val + " -> "); current = current.next; } System.out.println("null"); } } // 测试代码 MySingleLinkedList list = new MySingleLinkedList(); list.createList(); list.printList(); // 输出结果应类似于: 10 -> 20 -> 30 -> null ``` 这段程序展示了如何定义一个简单的单向链表并对其进行操作[^3]。 #### 初链表需注意的地方 对于初者来说,在接触链表之前应该具备一定的编程基础,尤其是熟悉结构体和指针的概念。因为链表的操作很大程度上依赖于这些基础知识的应用。另外,理解清楚每一步逻辑关系非常重要——比如新增加或者删除某个特定位置上的元素时,要特别小心调整好前后相邻两个节点之间的关联状态[^1]。 #### 推荐的习资料 为了更好地掌握链表这一知识点,可以从以下几个方面入手寻找合适自己的习材料: 1. 查阅官方文档或权威书籍了解理论知识; 2. 参考在线课程视频加深印象; 3. 动手实践编写小型项目巩固技能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值