顺序表
顺序表的存储结构
| |
| #define MAXSIZE 20 |
| typedef int ElemType; |
| typedef struct { |
| ElemType data[MAXSIZE]; |
| int length; |
| }SqList; |
也可以在主函数 main() 中简单定义一个数组, 表示顺序表, 这相当于定义并且初始化:
| #include <stdio.h> |
| #include <stdlib.h> |
| #define MAXSIZE 20 |
| typedef int ElemType; |
| int main(void) { |
| |
| ElemType* L = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE); |
| int length = 0; |
| |
| return 0; |
| } |
在顺序表中插入元素
| #include <stdio.h> |
| #include <stdlib.h> |
| #define MAXSIZE 20 |
| |
| void Inset(int* arr, int location, int elem, int* length) { |
| |
| |
| |
| |
| for (int i = (*length) - 1; i >= location - 1; i--) { |
| arr[i + 1] = arr[i]; |
| } |
| arr[location - 1] = elem; |
| ++(*length); |
| } |
| |
| int main(void) { |
| |
| int arr[MAXSIZE] = { 1,2,3,4,5 }; |
| int length = 5; |
| |
| |
| printf("插入元素之前的数组: "); |
| for (int i = 0; i < length; i++) { |
| printf("%d ", arr[i]); |
| } |
| |
| |
| Inset(arr, 3, 99, &length); |
| |
| |
| printf("\n插入元素之后的数组: "); |
| for (int i = 0; i < length; i++) { |
| printf("%d ", arr[i]); |
| } |
| |
| return 0; |
| } |
执行结果:
| 插入元素之前的数组: 1 2 3 4 5 |
| 插入元素之后的数组: 1 2 99 3 4 5 |
在顺序表中删除元素
| #include <stdio.h> |
| #include <stdlib.h> |
| #define MAXSIZE 20 |
| |
| void Delete(int* arr, int location, int* elem, int* length) { |
| *elem = arr[location - 1]; |
| |
| |
| |
| |
| for (int i = location; i <= (*length) - 1; i++) { |
| arr[i - 1] = arr[i]; |
| } |
| --(*length); |
| } |
| |
| int main(void) { |
| |
| int arr[MAXSIZE] = { 1,2,3,4,5 }; |
| int length = 5; |
| |
| |
| printf("插入元素之前的数组: "); |
| for (int i = 0; i < length; i++) { |
| printf("%d ", arr[i]); |
| } |
| |
| |
| int elem; |
| Delete(arr, 3, &elem, &length); |
| |
| |
| printf("\n删除元素之后的数组: "); |
| for (int i = 0; i < length; i++) { |
| printf("%d ", arr[i]); |
| } |
| |
| return 0; |
| } |
执行结果:
| 插入元素之前的数组: 1 2 3 4 5 |
| 删除元素之后的数组: 1 2 4 5 |
插入和删除元素的平均时间复杂度都是 O(n)。
单链表
单链表的存储结构
| |
| typedef int ElemType; |
| typedef struct LinkListNode { |
| ElemType data; |
| struct LinkListNode* next; |
| }LinkListNode; |
头插法创建单链表
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| typedef struct LinkListNode { |
| int data; |
| struct LinkListNode* next; |
| }LinkListNode; |
| |
| |
| void CreatLinkList(LinkListNode** L, int n) { |
| for (int i = 1; i <= n; i++) { |
| int data; |
| printf("输入第 %d 个结点的数据:", i); |
| LinkListNode* p = (LinkListNode*)malloc(sizeof(LinkListNode)); |
| scanf("%d", &(p->data)); |
| p->next = (*L)->next; |
| (*L)->next = p; |
| } |
| } |
| |
| void PrintLinkList(LinkListNode* L) { |
| LinkListNode* p = L->next; |
| while (p) { |
| printf("%d\t", p->data); |
| p = p->next; |
| } |
| } |
| |
| int main(void) { |
| LinkListNode* L = (LinkListNode*)malloc(sizeof(LinkListNode)); |
| L->next = NULL; |
| int n = 0; |
| printf("希望创建的单链表的长度为:"); |
| scanf("%d", &n); |
| |
| CreatLinkList(&L, n); |
| |
| printf("链表为:\n"); |
| PrintLinkList(L); |
| |
| return 0; |
| } |
执行结果:
| 希望创建的单链表的长度为:5 |
| 输入第 1 个结点的数据:1 |
| 输入第 2 个结点的数据:2 |
| 输入第 3 个结点的数据:3 |
| 输入第 4 个结点的数据:4 |
| 输入第 5 个结点的数据:5 |
| 链表为: |
| 5 4 3 2 1 |
尾插法创建单链表
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| typedef struct LinkListNode { |
| int data; |
| struct LinkListNode* next; |
| }LinkListNode; |
| |
| |
| void CreatLinkList(LinkListNode** L, int n) { |
| LinkListNode* r = *L; |
| for (int i = 1; i <= n; i++) { |
| int data; |
| printf("输入第 %d 个结点的数据:", i); |
| LinkListNode* p = (LinkListNode*)malloc(sizeof(LinkListNode)); |
| scanf("%d", &(p->data)); |
| p->next = NULL; |
| r->next = p; |
| r = p; |
| } |
| } |
| |
| void PrintLinkList(LinkListNode* L) { |
| LinkListNode* p = L->next; |
| while (p) { |
| printf("%d\t", p->data); |
| p = p->next; |
| } |
| } |
| |
| int main(void) { |
| LinkListNode* L = (LinkListNode*)malloc(sizeof(LinkListNode)); |
| L->next = NULL; |
| int n = 0; |
| printf("希望创建的单链表的长度为:"); |
| scanf("%d", &n); |
| |
| CreatLinkList(&L, n); |
| |
| printf("链表为:\n"); |
| PrintLinkList(L); |
| |
| return 0; |
| } |
执行结果:
| 希望创建的单链表的长度为:5 |
| 输入第 1 个结点的数据:1 |
| 输入第 2 个结点的数据:2 |
| 输入第 3 个结点的数据:3 |
| 输入第 4 个结点的数据:4 |
| 输入第 5 个结点的数据:5 |
| 链表为: |
| 1 2 3 4 5 |
单链表获取某个结点的值
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| typedef int ElemType; |
| |
| typedef struct LinkListNode { |
| ElemType data; |
| struct LinkListNode* next; |
| }LinkListNode; |
| |
| |
| void CreatLinkList(LinkListNode** L, int n) { |
| for (int i = 1; i <= n; i++) { |
| ElemType data; |
| printf("输入第 %d 个结点的数据:", i); |
| LinkListNode* p = (LinkListNode*)malloc(sizeof(LinkListNode)); |
| scanf("%d", &(p->data)); |
| p->next = (*L)->next; |
| (*L)->next = p; |
| } |
| } |
| |
| void PrintLinkList(LinkListNode* L) { |
| LinkListNode* p = L->next; |
| while (p) { |
| printf("%d\t", p->data); |
| p = p->next; |
| } |
| } |
| |
| ElemType GetNode(LinkListNode* L, int i) { |
| LinkListNode* p = L->next; |
| int j = 1; |
| while (j < i) { |
| p = p->next; |
| ++j; |
| } |
| return p->data; |
| } |
| |
| int main(void) { |
| LinkListNode* L = (LinkListNode*)malloc(sizeof(LinkListNode)); |
| L->next = NULL; |
| int n = 0; |
| printf("希望创建的单链表的长度为:"); |
| scanf("%d", &n); |
| |
| CreatLinkList(&L, n); |
| |
| printf("链表为:\n"); |
| PrintLinkList(L); |
| int location; |
| printf("\n想要获取第几个结点的值:"); |
| scanf("%d", &location); |
| printf("第 %d 个结点的值为:%d\n", location, GetNode(L, location)); |
| |
| return 0; |
| } |
执行结果:
| 希望创建的单链表的长度为:5 |
| 输入第 1 个结点的数据:1 |
| 输入第 2 个结点的数据:2 |
| 输入第 3 个结点的数据:3 |
| 输入第 4 个结点的数据:4 |
| 输入第 5 个结点的数据:5 |
| 链表为: |
| 5 4 3 2 1 |
| 想要获取第几个结点的值:5 |
| 第 5 个结点的值为:1 |
单链表插入结点
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| typedef int ElemType; |
| |
| typedef struct LinkListNode { |
| ElemType data; |
| struct LinkListNode* next; |
| }LinkListNode; |
| |
| |
| void CreatLinkList(LinkListNode** L, int n) { |
| for (int i = 1; i <= n; i++) { |
| ElemType data; |
| printf("输入第 %d 个结点的数据:", i); |
| LinkListNode* p = (LinkListNode*)malloc(sizeof(LinkListNode)); |
| scanf("%d", &(p->data)); |
| p->next = (*L)->next; |
| (*L)->next = p; |
| } |
| } |
| |
| void PrintLinkList(LinkListNode* L) { |
| LinkListNode* p = L->next; |
| while (p) { |
| printf("%d\t", p->data); |
| p = p->next; |
| } |
| } |
| |
| |
| |
| void Insert(LinkListNode** L, int i, ElemType elem) { |
| LinkListNode* p = *L; |
| int j = 0; |
| while (j < i - 1) { |
| p = p->next; |
| j++; |
| } |
| LinkListNode* s = (LinkListNode*)malloc(sizeof(LinkListNode)); |
| s->data = elem; |
| s->next = p->next; |
| p->next = s; |
| } |
| |
| int main(void) { |
| LinkListNode* L = (LinkListNode*)malloc(sizeof(LinkListNode)); |
| L->next = NULL; |
| int n = 0; |
| printf("希望创建的单链表的长度为:"); |
| scanf("%d", &n); |
| |
| CreatLinkList(&L, n); |
| |
| printf("链表为:\n"); |
| PrintLinkList(L); |
| |
| printf("\n输入要插入的结点的位置和新结点的数据值:"); |
| int location; |
| ElemType data; |
| scanf("%d %d", &location, &data); |
| Insert(&L, location, data); |
| |
| printf("插入结束的链表:\n"); |
| PrintLinkList(L); |
| |
| return 0; |
| } |
执行结果:
| 希望创建的单链表的长度为:5 |
| 输入第 1 个结点的数据:1 |
| 输入第 2 个结点的数据:2 |
| 输入第 3 个结点的数据:3 |
| 输入第 4 个结点的数据:4 |
| 输入第 5 个结点的数据:5 |
| 链表为: |
| 5 4 3 2 1 |
| 输入要插入的结点的位置和新结点的数据值:3 9 |
| 插入结束的链表: |
| 5 4 9 3 2 1 |
单链表删除结点
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| typedef int ElemType; |
| |
| typedef struct LinkListNode { |
| ElemType data; |
| struct LinkListNode* next; |
| }LinkListNode; |
| |
| |
| void CreatLinkList(LinkListNode** L, int n) { |
| for (int i = 1; i <= n; i++) { |
| ElemType data; |
| printf("输入第 %d 个结点的数据:", i); |
| LinkListNode* p = (LinkListNode*)malloc(sizeof(LinkListNode)); |
| scanf("%d", &(p->data)); |
| p->next = (*L)->next; |
| (*L)->next = p; |
| } |
| } |
| |
| void PrintLinkList(LinkListNode* L) { |
| LinkListNode* p = L->next; |
| while (p) { |
| printf("%d\t", p->data); |
| p = p->next; |
| } |
| } |
| |
| |
| |
| void Delete(LinkListNode** L, int i, ElemType* elem) { |
| LinkListNode* p = *L; |
| int j = 0; |
| while (j < i - 1) { |
| p = p->next; |
| j++; |
| } |
| LinkListNode* s = p->next; |
| p->next = p->next->next; |
| *elem = s->data; |
| free(s); |
| } |
| |
| int main(void) { |
| LinkListNode* L = (LinkListNode*)malloc(sizeof(LinkListNode)); |
| L->next = NULL; |
| int n = 0; |
| printf("希望创建的单链表的长度为:"); |
| scanf("%d", &n); |
| |
| CreatLinkList(&L, n); |
| |
| printf("链表为:\n"); |
| PrintLinkList(L); |
| |
| printf("\n输入要删除的结点的位置:"); |
| int location; |
| ElemType data; |
| scanf("%d", &location); |
| Delete(&L, location, &data); |
| |
| printf("删除结束的链表:\n"); |
| PrintLinkList(L); |
| |
| printf("\n被删除元素的值为:%d\n", data); |
| |
| return 0; |
| } |
执行结果:
| 希望创建的单链表的长度为:5 |
| 输入第 1 个结点的数据:1 |
| 输入第 2 个结点的数据:2 |
| 输入第 3 个结点的数据:3 |
| 输入第 4 个结点的数据:4 |
| 输入第 5 个结点的数据:5 |
| 链表为: |
| 5 4 3 2 1 |
| 输入要删除的结点的位置:3 |
| 删除结束的链表: |
| 5 4 2 1 |
| 被删除元素的值为:3 |
删除单链表
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| typedef int ElemType; |
| |
| typedef struct LinkListNode { |
| ElemType data; |
| struct LinkListNode* next; |
| }LinkListNode; |
| |
| |
| void CreatLinkList(LinkListNode** L, int n) { |
| for (int i = 1; i <= n; i++) { |
| ElemType data; |
| printf("输入第 %d 个结点的数据:", i); |
| LinkListNode* p = (LinkListNode*)malloc(sizeof(LinkListNode)); |
| scanf("%d", &(p->data)); |
| p->next = (*L)->next; |
| (*L)->next = p; |
| } |
| } |
| |
| void PrintLinkList(LinkListNode* L) { |
| LinkListNode* p = L->next; |
| while (p) { |
| printf("%d\t", p->data); |
| p = p->next; |
| } |
| } |
| |
| void Clear(LinkListNode* L, int* length) { |
| LinkListNode* p = L->next; |
| LinkListNode* q; |
| while (p) { |
| q = p->next; |
| free(p); |
| p = q; |
| --(*length); |
| } |
| L->next = NULL; |
| } |
| |
| int main(void) { |
| LinkListNode* L = (LinkListNode*)malloc(sizeof(LinkListNode)); |
| L->next = NULL; |
| int length = 0; |
| printf("希望创建的单链表的长度为:"); |
| scanf("%d", &length); |
| |
| CreatLinkList(&L, length); |
| |
| printf("链表为:\n"); |
| PrintLinkList(L); |
| |
| Clear(L, &length); |
| |
| printf("\n清空链表之后的链表长度为:%d\n", length); |
| |
| return 0; |
| } |
执行结果:
| 希望创建的单链表的长度为:5 |
| 输入第 1 个结点的数据:1 |
| 输入第 2 个结点的数据:2 |
| 输入第 3 个结点的数据:3 |
| 输入第 4 个结点的数据:4 |
| 输入第 5 个结点的数据:5 |
| 链表为: |
| 5 4 3 2 1 |
| 清空链表之后的链表长度为:0 |
循环链表
循环链表 circular link list
双向链表
双向链表 double link list
双向链表的存储结构
| |
| typedef int ElemType; |
| typedef struct DoubleLinkListNode { |
| ElemType data; |
| struct DoubleLinkListNode* next; |
| struct DoubleLinkListNode* prior; |
| }DoubleLinkListNode; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术