很基础 我也是小白如果可以提供到一些帮助 请往下看,有问题可以指出!!
下面是运行效果图:
如果有问题可以指出,留言:
下面是代码 也没啥好讲的: 注意结构体的指针调用问题就好了 ,分清楚指针和指向指针的指针就好了
1 //全局结构体 struct 2 typedef struct Stu { 3 union { 4 int num; 5 char name[10]; 6 }Stu; 7 int num; 8 int age; 9 char name[10]; 10 struct Stu* Next; 11 }Stus; 12 13 //定义个人用户方法操作 14 typedef struct _list { 15 Stus* head; 16 }List; 17 //清除整个链表 18 static void throughtdel(Stus* p); 19 static void select(Stus* p);//显示 20 static void searchs(Stus* p);//搜索 21 #define Len sizeof(Stus) 22 //动态链表*单向 23 static int LS = 0; 24 //建立链表结构 33 static void createtable(List *plist) { 34 printf("建立链表 请输入:索引 姓名 (输入0结束)) "); 35 Stus* a, * b; 36 plist->head = NULL; 37 a = b = malloc(Len); 38 //赋值 39 scanf("%d %s", &a->num, &a->name); 40 while (a->num!=0) 41 { 42 LS++; 43 if (LS == 1)plist->head= a; 44 else b->Next = a; 45 b = a; 46 a = malloc(Len); 47 //赋值 48 //printf("请输入:编号 姓名(输入0结束)) "); 49 scanf("%d %s", &a->num, &a->name); 50 if (a->num == 0)break; 51 } 52 b->Next = NULL; 79 } 80 //删除 某节点 81 static void dynamictable(List * list) { 82 Stus*q,*p; 83 /*List list; 84 list.head =head;*/ 85 int number; 86 printf("删除操作(输入索引): "); 87 scanf("%d", &number); 88 for (q=NULL, p= list->head;p ;q=p, p=p->Next) 89 { 90 if (p->num==number) 91 { 92 printf("删除后 "); 93 //删除 94 if (q) { //首位的是时候 q指向的 95 q->Next = p->Next; 96 free(p); 97 select(list->head); 98 break; 99 } 100 else { //如果首位怎么办? 101 list->head = p->Next; 102 free(p); 103 select(list->head); 104 break; 105 } 106 } 107 } 108 } 109 //删除方法二 110 static void del(List* list) { 111 Stus* q=list->head,*d=NULL; 112 if (q==NULL) 113 { 114 printf("nlist null!"); 115 return; 116 } 117 else { 118 int c = NULL; 119 printf("请输入删除数下标:"); 120 scanf("%d", &c); 121 while (q->num!=c&&q->Next!=NULL) 122 { 123 d = q; 124 q = q->Next; 125 } 126 if (q->num==c) 127 { 128 if (q==list->head)//首位 129 { 130 list->head = q->Next; //首位改变 131 return; 132 } 133 else { 134 d->Next = q->Next; 135 free(q); 136 return; 137 } 138 } 139 else { 140 printf("没有找到要删除的元素"); 141 } 142 143 } 144 145 } 146 //显示全部节点 147 static void select(Stus* p) { 148 printf("---------------------------查询结果----------------------------------- "); 149 for (; p; p = p->Next) 150 { 151 printf("%d %s ", p->num, p->name); 152 } 153 printf("--------------------------------------------------------------------- "); 154 return; 155 } 156 //搜索 157 static void searchs(Stus *p) { 158 int s = 1,number=NULL; 159 printf("请输入搜索的索引:"); scanf("%d", &number); 160 for (; p; p = p->Next) 161 { 162 if(number==p->num){ 163 s = 0; 164 printf("已找到: %d %s ", p->num, p->name); 165 //break; 166 } 167 } 168 if (s)printf("没有找到!"); 169 return; 170 } 171 //清除整个链表 172 static void throughtdel (Stus* p) { 173 Stus* q; 174 for (q=NULL;p;p=q) 175 { 176 q = p->Next; 177 free(p); 178 } 179 } 180 //对链表进行排序 降序(0) 或者 升序(1) 181 static void swap(int *a,int *b) { 182 int m = *a; 183 *a = *b; 184 *b = m; 185 } 186 //排序 187 static void order(List* list) { 188 int g = 0; printf("降序(0)?升序(1) 请输入:"); 189 scanf("%d", &g); 190 Stus* q, * p, * c; //冒泡排序 191 c = q = p = NULL; 192 if (list->head->Next== NULL || list == NULL) 193 { 194 return; 195 } 196 for (q = list->head; q != NULL; q = q->Next) 197 { 198 for (p = list->head; p->Next!= NULL; p = p->Next) 199 { 200 if(g){ 201 if (p->num > p->Next->num) //q q+1 202 { 203 swap(&p->Next->num, &p->num); 204 swap(&p->Next->name, &p->name); 205 } 206 }else{ 207 if (p->num < p->Next->num) //q q+1 208 { 209 swap(&p->Next->num, &p->num); 210 swap(&p->Next->name, &p->name); 211 } 212 } 213 214 } 215 } 216 select(list->head); 217 return; 218 } 219 //求最大 域值的位置 220 static void maxdj(Stus *arr,Stus**s) { 221 //返回s 222 Stus* p; 223 p = arr->Next; 224 *s = arr;//首位比较 225 while (p->Next!=NULL) 226 { 227 p = p->Next; 228 if ((*p).num > (*s)->num)*s = p; 229 } 230 return; 231 } 232 //插入 链表中 添加 233 static void adds(Stus **arr) { 234 Stus* stat = (Stus*)malloc(Len); 235 printf("添加请输入:索引 姓名 "); 236 scanf("%d %s", &stat->num, &stat->name); 237 getchar(); 238 //添加到首位 239 stat->Next = *arr; 240 (*arr) = stat; 241 return; 242 } 243 //修改 244 static void update(Stus** arr) { 245 int*ins = (int*)malloc(sizeof(int)),c=1; 246 char*dc= (char*)malloc(sizeof(char)); 247 Stus *p=*arr; 248 printf("请输入要修改的序号:"); 249 scanf("%d", ins); 250 while (p!=NULL) 251 { 252 if ((*arr)->num==*ins) 253 { 254 c = 0; 255 printf("请输入要修改的值:"); 256 scanf("%s", dc); 257 strcpy(p->name, dc); 258 break; 259 } 260 p = p->Next; 261 } 262 if (c)printf("没有找到您要修改的 数据! "); 263 else printf("完毕! 输入1查询; "); 264 free(ins); 265 266 return; 267 } 268 //全局操作 //说明 :List 的head本身就是指针 所以操作只可以用 Stu** 来操作 269 static void operation() { 270 static void maxdj(Stus * arr, Stus **s);//求最大 域值的位置 271 static void select(Stus * p);//显示链表 272 static void dynamictable(List*list);//删除某节点 273 static void searchs(Stus * p); //搜索 274 static void order(Stus * list); 275 static void del(List * list);//删除2 276 //降序后插入 链表中 277 static void adds(Stus * *arr); 278 //修改 279 static void update(Stus * *arr); 280 Stus *s; 281 int ops = 0,*oop=&ops; 282 List list; //链表头声明 283 list.head = NULL; //初始化 284 createtable(&list);//赋值操作 //list就代表了整个链表 **** nb 285 printf("请输入操作: 1:查询链表 2:删除某个链表 3:搜索 4.求最大域值 5.排序排列! 6.插入 7:修改 8:删除某链表(输入0结束!) "); 286 scanf("%d", oop); 287 while (*oop) 288 { 289 switch (*oop) 290 { 291 case 1: //查询 292 select(list.head); 293 break; 294 case 2: //删除 某节点 295 dynamictable(&list); 296 break; 297 case 3://搜索某节点 298 searchs(list.head); 299 break; 300 case 4://求最大 域值的位置 301 maxdj(list.head,&s); 302 printf("最大的域位置和值为: %d %s ", (*s).num, (*s).name); 303 break; 304 case 5://排序 //对链表进行排序 降序(0) 或者 升序(1) 305 //对链表进行排序 降序(0) 或者 升序(1) 306 order(&list); 307 printf("完毕! 输入1查询; "); 308 break; 309 case 6://插入节点 310 adds(&list.head); 311 printf("完毕! 输入1查询; "); 312 break; 313 case 7://修改 314 update(&list.head); 315 break; 316 default: 317 //删除方法二 318 del(&list); 319 printf("完毕! 输入1查询; "); 320 break; 321 } 322 printf("请输入操作: 1:查询链表 2:删除某个链表 3:搜索 4.求最大域值 5.排序排列! 6.插入 7:修改 8:删除某链表(输入0结束!) "); 323 scanf("%d", oop); 324 } 325 printf("结束操作! "); 326 327 } 332 //动态插入 按照输入索引位置插入 没有找到则插入到最前面 333 static td(Stus*head) { 334 Stus* p = head, * q = NULL, * cc = (Stus*)malloc(Len); int oc = 0; 335 cc->Next = NULL; 336 //插入操作 337 printf("请输入插入的数:"); 338 scanf("%d %d", &cc->num, &oc); 339 cc->Next = NULL; 340 341 while (p->Next != NULL && p->num != oc) 342 { 343 q = p; 344 p = p->Next; 345 } 346 if (q == NULL) 347 { 348 printf("找到了!在首位"); 349 cc->Next = p->Next; 350 p->Next = cc; 351 352 } 353 else { 354 if (p->num == oc) 355 { 356 printf("找到了!"); 357 q->Next = cc; 358 cc->Next = p; 359 } 360 else { 361 printf("没有找到了!"); 362 p->Next = cc; 363 cc->Next = NULL; 364 } 365 } 366 367 while (head != NULL) 368 { 369 printf("%d ", head->num); 370 head = head->Next; 371 } 372 373 374 }