链表程序
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef int datatype; 5 typedef struct node/*链表的每一个节点都是结构体*/ 6 { 7 datatype data; 8 struct node *next; 9 }linklist;/*linklist 是struct node 的别名,以后就可以用linklist来替代struct node*/ 10 11 /*函数声明区*/ 12 /*增删改查这几个函数形参一般都要有头节点*/ 13 linklist * list_create(); 14 int head_insert(linklist *H,datatype value); 15 int head_delete(linklist *H); 16 void list_show(linklist *H); 17 //空----1 非空-----0 18 int list_empty(linklist *H); 19 int list_insert(linklist *H,datatype value,int pos); 20 int list_delete(linklist *H,datatype value); 21 int list_replace(linklist *H,datatype old,datatype new); 22 int list_search(linklist *H,datatype value); 23 void list_recorver(linklist *H); 24 25 int main(int argc, const char *argv[]) 26 { 27 linklist *H = NULL; 28 if((H = list_create()) == NULL) 29 { 30 printf("list_create failed\n"); 31 return -1; 32 } 33 34 head_insert(H,1); 35 head_insert(H,2); 36 head_insert(H,3); 37 head_insert(H,4); 38 head_insert(H,5); 39 list_show(H); 40 41 head_delete(H); 42 list_show(H); 43 44 list_insert(H,10,2); 45 list_show(H); 46 47 list_delete(H,3); 48 list_show(H); 49 50 list_replace(H,10,100); 51 list_show(H); 52 53 printf("search:%d\n",list_search(H,1)); 54 55 list_recorver(H); 56 list_show(H); 57 58 return 0; 59 } 60 /*h是头结点,p是第首节点,因为头结点和首节点到尾节点之间的节点数据类型都一样,都是struct node类型的*/ 61 linklist * list_create() 62 { 63 linklist *H = NULL;//定义任何一个指针都需要初始化,一般初始化为NULL,然后再重新指向,否则成为野指针。 64 if((H = malloc(sizeof(linklist))) == NULL) 65 { 66 printf("malloc failed\n"); 67 return NULL; 68 } 69 70 H->next = NULL;//防止野指针。 71 72 return H; 73 } 74 75 int head_insert(linklist *H,datatype value) 76 { 77 linklist *p = NULL;/*防止野指针*/ 78 if((p = malloc(sizeof(linklist))) == NULL) 79 { 80 printf("malloc node failed\n"); 81 return -1; 82 } 83 /*把p插在h的后面*/ 84 p->data = value;//p的数据域为value 85 p->next = H->next;//h节点后面的节点的地址为h->next,把h后面的节点的地址 保存在p的指针域(p->next)中。 86 H->next = p;//把p的内容 给第一个节点的指针域(h->next) 87 88 return 0; 89 } 90 91 void list_show(linklist *H) 92 { 93 while(H->next != NULL)//防止第一个节点后没有节点。 94 { 95 printf("%d ",H->next->data);//第二个节点的数据域 96 H = H->next;//指向下一个节点,H移动。 97 } 98 printf("\n"); 99 } 100 101 int head_delete(linklist *H) 102 { 103 linklist *p = H->next; 104 if(list_empty(H)) 105 { 106 printf("list is empty\n"); 107 return -1; 108 } 109 110 H->next = p->next; 111 free(p);//p节点所指向的内存被回收,p本身还存在。 112 p = NULL; 113 114 return 0; 115 } 116 117 int list_empty(linklist *H)//判断是否为空链表 什么是空链表?只有头节点,没有首节点。 118 { 119 if(H->next != NULL) 120 return 0; 121 else 122 return 1; 123 } 124 125 int list_insert(linklist *H,datatype value,int pos)/*指定位置插入节点,value是值,pos是位置,在pos后面插入*/ 126 { 127 int i = 0; 128 linklist *p = H,
linklist *q = NULL; 129 while(i < pos && p != NULL) 130 { 131 p = p->next; 132 i++;//当i>pos时,p便不再移动,i也不再加一 133 } 134 135 if(p == NULL) 136 { 137 printf("pos error\n"); 138 return -1; 139 } 140 141 if((q = malloc(sizeof(linklist))) == NULL) 142 { 143 printf("malloc node failed\n"); 144 return -1; 145 } 146 /*和头插法的插入一样*/ 147 q->data = value; 148 q->next = p->next; 149 p->next = q; 150 151 return 0; 152 } 153 154 int list_delete(linklist *H,datatype value)/*指定位置删除节点*/ 155 { 156 linklist *p = NULL; 157 158 while(H->next != NULL) 159 { 160 if(H->next->data == value) 161 { 162 p = H->next; 163 H->next = p->next; 164 free(p); 165 p = NULL; 166 167 return 0; 168 } 169 else 170 H = H->next; 171 } 172 173 printf("no value"); 174 return -1; 175 } 176 177 int list_replace(linklist *H,datatype old,datatype new)/*改动值*/ 178 { 179 while(H->next != NULL) 180 { 181 if(H->next->data == old) 182 { 183 H->next->data = new; 184 return 0; 185 } 186 else 187 { 188 H = H->next; 189 } 190 } 191 192 return -1; 193 } 194 195 int list_search(linklist *H,datatype value) 196 { 197 int pos = 0; 198 while(H->next != NULL) 199 { 200 if(H->next->data == value) 201 return pos; 202 else 203 { 204 H = H->next; 205 pos++; 206 } 207 } 208 209 printf("no found\n"); 210 return -1; 211 } 212 213 void list_recorver(linklist *H) 214 { 215 linklist *q = NULL,*p = H->next; 216 H->next = NULL; 217 218 while(p != NULL) 219 { 220 q = p; 221 p = p->next; 222 q->next = H->next; 223 H->next = q; 224 } 225 }