1 #include <stdio.h>/*单向链表*///不要求逻辑上相邻的两个元素物理上也相邻,通过"链"建立起数据之间的逻辑关系
2 #include <stdlib.h>
3 #include<malloc.h>
4 typedef int ElementType; //需要链表中什么元素,就可以定义为什么类型
5 typedef struct LNode *List;//把struct Lnode* 重命名为List,
6 struct LNode
7 {
8 ElementType Data; //数据域
9 List Next; //下一个链表的地址
10 };
11 List L;
12 List MakeEmpty(); //初始化链表
13 int Length(List L); // 以遍历链表的方法求链表长度
14 List FindKth(int K,List L); // 按序号查找
15 List Find(ElementType X,List L); // 按值查找
16 List Insert(ElementType X,int i,List L); //将 X 插入到第 i-1(i>0) 个结点之后
17 List Delete(int i,List L); // 删除第 i(i>0) 个结点
18 void Print(List L); // 输出链表元素
19
20 List MakeEmpty(){
21 List L = (List)malloc(sizeof(struct LNode));
22 L = NULL;
23 return L;
24 }
25
26 int Length (List L){
27 List p = L;
28 int len = 0;
29 while(p){ //当p不为空
30 p = p->Next;
31 len++;
32 }
33 return len;
34 }
35 //按序查找
36 List FindKth(int K, List L){
37 List p = L;
38 int i = 1;//从1开始
39 while(p &&i<K){
40 p->Next;
41 i++;
42 }
43 if(i == K) //找到了
44 return p;
45 else
46 return NULL;
47 }
48 //按值查找
49 List Find(ElementType X, List L){
50 List p = L;
51 while(p&&p->Data!=X)
52 p = p->Next;
53 return p; //找到了返回p 找不到,返回NULL,此时P等于NUll
54 }
55 /* 插入
56 1. 用 s 指向一个新的结点
57 2. 用 p 指向链表的第 i-1 个结点
58 3. s->Next = p->Next,将 s 的下一个结点指向 p 的下一个结点
59 4. p->Next = s,将 p 的下一结点改为 s */
60 List Insert(ElementType X,int i , List L){
61 List p,s;
62 if (i == 1){ //新节点插入在表头
63 s = (List)malloc(sizeof(struct LNode));
64 s->Data = X;
65 s->Next = L;
66 return s; //插入的节点为头结点
67 }
68 p = FindKth(i - 1, L); //找到弟i-1个节点
69 if(!p){//第i个节点不存在
70 printf("节点错误");
71 return NULL;
72
73 }
74 else
75 {
76 s = (List)malloc(sizeof(struct LNode));
77 s->Data = X;
78 s->Next = p->Next; //s的下一个结点指向p的下一个结点
79 p->Next = s;
80 return L;
81 }
82
83 }
84 /* 删除
85 1. 用 p 指向链表的第 i-1 个结点
86 2. 用 s 指向要被删除的的第 i 个结点
87 3. p->Next = s->Next,p 指针指向 s 后面
88 4. free(s),释放空间
89 */
90 List Delete(int i, List L){
91 List p, s;
92 if(i==1){ //如果要删除头结点
93 s = L;
94 if(L)
95 L = L->Next;
96 else
97 return NULL;
98 free(s);
99 return L;
100 }
101 p = FindKth(i - 1, L);//查找第i-1个节点
102 if(!p||!(p->Next)){ //第i或者第i-1个节点不存在
103 printf("节点错误");
104 return NULL;
105 }
106 else
107 {
108 s = p->Next;
109 p->Next = s->Next;
110 free(s);//释放被删除节点
111 return L;
112 }
113
114 }
115
116 //输出链表元素
117 void Print(List L){
118 List t;
119 int flag = 1;
120 printf("当前链表为:");
121 for (t = L; t;t=t->Next){
122 printf("%d", t->Data);
123 flag = 0;
124 }
125 if(flag)
126 printf("NULL");
127 printf("\n");
128 }
129
130 int main(){
131 L = MakeEmpty();
132 Print(L);
133 L = Insert(11,1,L);
134 L = Insert(25,1,L);
135 L = Insert(33,2,L);
136 L = Insert(77,3,L);
137 Print(L);
138 printf("当前链表长度为:%d\n",Length(L));
139 printf("此时链表中第二个结点的值是:%d\n",FindKth(2,L)->Data);
140 printf("查找22是否在该链表中:");
141 if(Find(22,L))
142 printf("是!\n");
143 else
144 printf("否!\n");
145 printf("查找33是否在该链表中:");
146 if(Find(33,L))
147 printf("是!\n");
148 else
149 printf("否!\n");
150 L = Delete(1,L);
151 L = Delete(3,L);
152 printf("----------删除后-----\n");
153 Print(L);
154 return 0;
155 }