单链表
1、特点:任意存储,顺序存取
2、结构体定义和预定义
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include<stdio.h> #include<stdlib.h>//malloc函数 #define ElemType int #define Status int #define ERROR 0 #define OK 1 typedef struct Lnode { ElemType data; struct Lnode *next; }Lnode,*Linklist; |
3、初始化(本来头节点的初始化也放置在构建链表的函数中,但是一直段错误,所以吧头结点的初始化放在了主函数内)
1 2 3 4 5 6 7 8 9 10 11 12 | void Create_L(Linklist L, int n) //头插法 还有一种尾插法,都可以简单实现 { int i; Linklist p; for (i = n;i>0;--i){ //一开始需要定义节点个数 p = (Linklist)malloc( sizeof (Lnode)); printf( "please input integer:" ); scanf( "%d" ,&p->data); p->next = L->next; //头插法; L->next = p;<br> // q = L;q->next = p; q = p;尾插法 } } |
4、获取单链表的第i个元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //find获取第i个元素 Status GetElem_L(Linklist L, int i,ElemType *e) { Linklist p; int j; p = L->next; //注意啊,单链表的操作,一般都会先赋值头节点,而不是直接拿头结点进行操作 j = 1; while (p&&j<i) { p = p->next; //找到j的位置 j++; } if (!p||j>i) { return ERROR; } *e = p->data; return OK; } |
5、在i的位置插入元素e
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | //在i位置插入元素e Status ListInsert_L(Linklist L, int i,ElemType e) { Linklist p,s; p = L; int j = 0; while (p&&j<i-1) //找到插如位置的前一个节点 { p = p->next; j++; } if (!p||j>i-1) { return ERROR; } s = (Linklist)malloc( sizeof (Lnode)); //为新节点申请空间,把节点放进单链表中 s->data = e; s->next = p->next; p->next = s; return OK; } |
6、删除节点i并且保存其元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //删除位置i的元素并且保存 Status ListDelete_L(Linklist L, int i,ElemType *e) { Linklist p; Linklist q; int j = 0; p = L; while (p&&j<i-1) //找到删除节点的前一个 { p = p->next; j++; } if (!p||j>i-1) { return ERROR; } q = p->next; *e = q->data; p->next = q->next; free(q); //释放删除节点的空间 return OK; } |
7、两个单链表的操作,ab有序,c也有序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | void MergeList_L(Linklist a,Linklist b,Linklist c) { Linklist pa,pb,pc; pa = a->next; //有头结点 pb = b->next; pc = c = a; while (pa&&pb) { if (pa->data <= pb->data) { pc->next = pa; pc = pa; pa = pa->next; } else { pc->next = pb; pc = pb; pb = pb->next; } } while (pa) { pc->next = pa; pc = pa; pa = pa->next; } while (pb) { pc->next = pb; pc = pb; pb = pb->next; } free(b); //a作为c的相应头结点,所以只释放了b } |
8、主函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | int main() { Linklist La = (Linklist)malloc( sizeof (Lnode)); La->next = NULL;; int n; int i = 2; ElemType e; printf( "please input num:" ); scanf( "%d" ,&n); Create_L(La,n); Output(La); GetElem_L(La,n,&e); printf( "%d\n" ,e); ListInsert_L(La,i,e); Output(La); ListDelete_L(La,i,&e); printf( "%d\n" ,e); Output(La); free(La); return 0; } |
9、输出函数
1 2 3 4 5 6 7 8 9 10 | void Output(Linklist L) { Linklist p = L->next; while (p) { printf( "%4d" ,p->data); p = p->next; } printf( "\n" ); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)