1 #include <stdio.h>
2 #include <stdlib.h>
3 typedef int ElemType;
4 typedef struct LNode{
5 ElemType date;
6 struct LNode *next;//定义一个此链表的结构体类型,指向下一元素
7 }LinkList;
8 //建立单链表(头插法)
9 void CreateListHead(LinkList *&L, ElemType arr[], int len) {
10 LinkList *s;
11 L = (LinkList*)malloc(sizeof(LinkList));
12 L->next = NULL;
13 for(int i = 0; i < len; i++) {
14 s = (LinkList*)malloc(sizeof(LinkList));//在单链表中,每添加一个数据元素,都要分配一个新的空间
15 s->date = arr[i];
16 s->next = L->next;
17 L->next = s;
18 }
19 }
20 //建立单链表(尾插法)
21 void CreateListTail(LinkList *&LS, ElemType arrs[], int lens) {
22 LinkList *p,*q;
23 p = LS;
24 for(int i = 0; i < lens; i++) {
25 q = (LinkList*)malloc(sizeof(LinkList));
26 q->date = arrs[i];
27 p->next = q;
28 p = q;
29 }
30 p->next = NULL;
31 }
32 //初始化链表
33 void InitList(LinkList *&L) {
34 L = (LinkList*)malloc(sizeof(LinkList));//创建头节点,头节点不存放数据,只用来指引
35 L->next = NULL;
36 }
37 //求链表长度
38 void ListLength(LinkList *L) {
39 int n = 0;
40 LinkList *p = L;//创建一个此单链表的指针,指向头节点。在修改链表数据时(删除、添加...),头节点不能改变,通过创建指针指向头节点来使用头节点的数据
41 while(p->next != NULL) {
42 n++;
43 p = p->next;
44 }
45 printf("%d\n",n);
46 }
47 //按序号查找
48 void GetElem(LinkList *&L, int k) {
49 if(k <= 0) {
50 printf("查找元素位置有误!\n");
51 } else {
52 LinkList *p = L;
53 int i = 0;
54 while(i < k && p != NULL) {
55 i++;
56 p = p->next;
57 }
58 if(p == NULL) {
59 printf("没有找到\n");
60 } else {
61 printf("找到了,第%d个元素是%d\n",k,p->date);
62 }
63 }
64 }
65 //删除链表元素
66 void ListDelete(LinkList *&L, int k) {
67 if(k <= 0) {
68 printf("删除位置有误!\n");
69 } else {
70 LinkList *p = L,*q;
71 int i = 0;
72 while(i < k-1 && p != NULL) {
73 i++;
74 p = p->next;
75 }
76 if(p == NULL) {
77 printf("链表中无此元素\n");
78 } else {
79 q = p->next;
80 if(q == NULL) {
81 printf("链表中无此元素\n");
82 } else {
83 printf("要删除的元素为:%d\n",q->date);
84 p->next = q->next;
85 free(q);//在单链表中,除添加元素要分配空间外,删除元素要释放空间
86 }
87 }
88 }
89 }
90 //输出链表
91 void DispList(LinkList *L) {
92 if(L->next == NULL) {
93 printf("当前链表为空!\n");
94 } else {
95 LinkList *p = L->next;
96 while(p != NULL) {
97 printf("%d ",p->date);
98 p = p->next;
99 }
100 printf("\n");
101 }
102 }
103 //销毁链表
104 void DeleteList(LinkList *&L) {
105 LinkList *p = L,*q = L->next;
106 while(q != NULL) {
107 free(p);//释放包括头节点在内的每个节点空间
108 p = q;
109 q = p->next;
110 }
111 free(p);//释放最后一个数据元素的空间
112 }
113 int main() {
114 int arr[5] = {1,2,3,4,5};
115 int arrs[5] = {1,2,3,4,5};
116 int len = sizeof(arr)/sizeof(arr[0]);
117 int lens = sizeof(arrs)/sizeof(arrs[0]);
118 LinkList *L;
119 LinkList *LS;
120 InitList(L);
121 CreateListHead(L,arr,len);
122 CreateListTail(LS,arrs,lens);
123 ListLength(L);
124 ListLength(LS);
125 GetElem(L,3);
126 ListDelete(LS,4);
127 DispList(L);
128 DispList(LS);
129 DeleteList(L);
130 return 0;
131 }
2023-12-1219:07:43
2.单链表的简单操作
ZZH的青青草原2023-12-12 19:38