c语言单向动态链表,C语言 单向 动态链表的增 删 改 查操作, 非常易懂!

1 //全局结构体 struct

2 typedef structStu {3 union {4 intnum;5 char name[10];6 }Stu;7 intnum;8 intage;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结束))\n");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结束))\n");

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 intnumber;86 printf("删除操作(输入索引):\n");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("删除后\n");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("---------------------------查询结果-----------------------------------\n");149 for (; p; p = p->Next)150 {151 printf("%d %s\n", p->num, p->name);152 }153 printf("---------------------------------------------------------------------\n");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 \n\n", 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("添加请输入:索引 姓名\n");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("没有找到您要修改的 数据!\n");263 else printf("完毕! 输入1查询;\n");264 free(ins);265

266 return;267 }268 //全局操作//说明 :List 的head本身就是指针 所以操作只可以用 Stu** 来操作

269 static voidoperation() {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);//删除2276 //降序后插入 链表中

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结束!)\n");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\n", (*s).num, (*s).name);303 break;304 case 5://排序//对链表进行排序 降序(0) 或者 升序(1)305 //对链表进行排序 降序(0) 或者 升序(1)

306 order(&list);307 printf("完毕! 输入1查询;\n");308 break;309 case 6://插入节点

310 adds(&list.head);311 printf("完毕! 输入1查询;\n");312 break;313 case 7://修改

314 update(&list.head);315 break;316 default:317 //删除方法二

318 del(&list);319 printf("完毕! 输入1查询;\n");320 break;321 }322 printf("请输入操作: 1:查询链表 2:删除某个链表 3:搜索 4.求最大域值 5.排序排列! 6.插入 7:修改 8:删除某链表(输入0结束!)\n");323 scanf("%d", oop);324 }325 printf("结束操作!\n");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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍一下 C 语言动态链表操作。 首先,我们需要定义一个链表结构体: ```c typedef struct Node { int data; struct Node *next; } Node, *LinkedList; ``` 其中,`data` 表示链表节点中存储的数据,`next` 表示指向下一个节点的指针。 接下来,我们可以实现链表的创建操作: ```c LinkedList createList() { LinkedList head = (LinkedList)malloc(sizeof(Node)); head->next = NULL; return head; } ``` 这个函数会返回一个链表头节点的指针,也就是一个空链表。 接下来,我们可以实现链表节点的插入操作: ```c void insertNode(LinkedList L, int data) { Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = data; newNode->next = L->next; L->next = newNode; } ``` 这个函数会在链表头节点后插入一个新的节点。 接下来,我们可以实现链表节点的操作: ```c void deleteNode(LinkedList L, int data) { Node *p = L; while (p->next != NULL && p->next->data != data) { p = p->next; } if (p->next == NULL) { printf("Not found!\n"); return; } Node *tmp = p->next; p->next = tmp->next; free(tmp); } ``` 这个函数会在链表找指定数据的节点,并除它。 最后,我们可以实现链表节点的操作: ```c Node *findNode(LinkedList L, int data) { Node *p = L->next; while (p != NULL && p->data != data) { p = p->next; } return p; } ``` 这个函数会在链表找指定数据的节点,并返回它的指针。 以上就是 C 语言动态链表操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值