Loading... <div class="tip inlineBlock error"> 千万别直接free(head); </div> * 释放链表必须要逐个节点释放 * 先保存下一个节点位置 ```C while(pb->NULL) { head = pb -> next; free(pb); pb = head; } ``` * main.c ```C #include<stdio.h> #include<string.h> #include<stdlib.h> #include "link.h" void stu_help(void); void print_link(STU* head); int main(int argc, char* argv[]) { //定义一个链表头 注意一定要赋值为NULL STU* head = NULL; stu_help(); while (1) { char cmd[6]=""; printf("请输入操作指令:"); scanf("%s", cmd); if (strcmp(cmd, "help") == 0) { stu_help();//帮助 } else if (strcmp(cmd, "insert") == 0) { STU tmp; printf("请输入需要插入的数据:"); scanf("%d %s %f", &tmp.num, tmp.name, &tmp.score); //将tmp数据插入到head所指向的链表中 head = insert_link(head, tmp); //也可以传递二级指针&head } else if (strcmp(cmd, "print") == 0) { print_link(head); } else if (strcmp(cmd, "search") == 0) { char name[32]=""; STU* ret = NULL; printf("请输入需要查找的用户名:"); scanf("%s", name); ret = search_link(head,name); if (ret != NULL) { printf("num=%d, name=%s, score=%f\n", ret->num, ret->name, ret->score); } else { printf("没有找到%s的相关节点信息。\n",name); } } else if (strcmp(cmd, "delete") == 0) { char name[32] = ""; printf("请输入将要删除的姓名:"); scanf("%s", name); head=detele_link(head,name);//以防头节点被删除,更新头节点 } else if (strcmp(cmd, "free") == 0) { head = free_link(head); } else if (strcmp(cmd, "quit") == 0) { //释放链表 head = free_link(head); break; } } return 0; } //帮助 void stu_help(void) { printf("############################\n"); printf("# help:打印帮助信息 #\n"); printf("# insert:插入链表节点 #\n"); printf("# print:遍历链表节点信息 #\n"); printf("# search:查询链表节点 #\n"); printf("# delete:删除链表节点 #\n"); printf("# free:释放链表节点 #\n"); printf("# quit:退出 #\n"); printf("############################\n"); } ``` * link.c ```C #include<stdlib.h> #include<stdio.h> #include "link.h" #include<string.h> void stu_help(void); //#if 0 ////链表的头部之前插入 //STU* insert_link(STU *head,STU tmp) { // //1、从堆区申请一个等待插入的节点空间 // STU* pi = (STU*)calloc(1, sizeof(STU)); // if (pi == NULL) // { // perror("calloc"); // return head; // } // // //2、将tmp的值,赋值给 *pi // *pi = tmp; // pi->next = NULL; // // //3/将pi插入到链表中 // if (head == NULL) { // //链表不存在 // head = pi; // } // else { // //链表存在(头部之前插入 // //1、让pi 指向旧的头 // pi->next = head; // // //2、head指向新的头节点 // head = pi; // } // // return head; //} //#endif //链表的尾部插入 STU* insert_link(STU* head, STU tmp) { //1、申请待插入的节点 STU* pi = (STU*)calloc(1, sizeof(STU)); if (pi == NULL) { perror("calloc"); return head; } //2、将tmp的数据赋值到 *pi *pi = tmp; pi->next = NULL; //3、将节点插入到链表的尾部 if (head == NULL) { //链表不存在 head = pi; } else { //链表存在 //a、寻找链表的尾节点 STU* pb = head; while (pb->next != NULL) //如果不是尾节点 pb = pb->next; //pb就指向下一个节点 //b、用尾节点 pb 链接上 插入的节点pi pb->next = pi; } return head; } //#if 0 ////链表的有序插入 以num降序排列 //STU* insert_link(STU* head, STU tmp) { // //老规矩1、给带插入的节点申请堆区空间 // STU* pi = (STU*)calloc(1, sizeof(STU)); // if (pi == NULL) { // perror("calloc"); // //打印错误信息 // return head; // } // //2、给申请的结构空间节点赋值(将tmp的内容 赋值给 *pi) // *pi = tmp; // pi->next = NULL; // // //3、将申请的结构空间节点插入(链表节点pi的插入) // if (head == NULL) // { // //链表不存在 // head = pi; // } // else{ // //链表存在 // //a、寻找插入点 // STU* pb = head, * pf = head; // while (pb->num < pi->num && pb->next != NULL) // { // pf = pb; // pb = pb->next; // } // //b、插入点的判断 // if (pb->num >= pi->num) // { // //头部 or 中部插入 // if (pb == head) // { // //头部插入 // pi->next = head; // head = pi; // } // else { // //中部插入 // pf->next = pi; // pi->next = pb; // } // } // else { // //尾部插入 // pb->next = pi; // } // // } // return head; //} //#endif void print_link(STU* head) { if (head == NULL) { //链表不存在 printf("link not find\n"); return; } else { //遍历 STU* pb = head; while (pb != NULL) { printf("%d %s %f\n", pb->num, pb->name, pb->score); //pb指向下一个节点 pb = pb->next; } } return; } STU* search_link(STU* head, char* name) { //1.判断链表是否存在 if (head == NULL) { printf("link not found\n"); return NULL; } else { //链表存在 STU* pb = head; //逐个将节点中的name,和穿入的name while (strcmp(pb->name, name) != 0 && pb->next != NULL) pb = pb->next; //判断是否找到 if (strcmp(pb->name, name) == 0) { //找到 return pb; } else { //没找到 return NULL; } } } STU* detele_link(STU* head, char* name) { //1.判断链表是否存在 if (head == NULL) { //不存在 printf("link not found\n"); return head; } else { //存在 //2.寻找删除点 STU* pb = head, * pf = head; while (strcmp(pb->name, name) != 0 && pb->next != NULL) { pf = pb; pb = pb->next; } //3.找到插入点(前、中、后、找不到) if (strcmp(pb->name, name) == 0)//找到删除点 { //4.判断删除点的位置 if (pb = head)//删除头节点 { head = pb->next; //free(pb); } else { //中部或尾部节点 pf->next = pb->next; //free(pb); } free(pb); printf("已成功删除%s相关节点\n",name); } else { //没找到删除点 printf("链表中没有%s相关的数据节点信息\n", name); } } return head; } STU* free_link(STU* head) { //判断链表是否存在 if (head == NULL) { printf("link not found\n"); return head; } else { //链表存在 STU* pb = head; //逐个节点释放 while (pb != NULL) { //head保存下一个节点的位置 head = pb->next; //释放pb指向的节点 free(pb); //pb指向下一个未释放的节点 pb = head; } printf("链表释放成功。\n"); return head; } return head; } ``` * link.h ```C //#pragma once //防止头文件重复包含 #ifndef __LINK_H_ #define __LINK_H_ //链表节点类型定义 typedef struct stu { //数据域 int num; char name[32]; float score; //指针域 struct stu* next; }STU; extern STU* insert_ilnk(STU *head, STU tmp); extern void print_link(STU* head); extern STU* search_link(STU* head, char* name); extern STU* detele_link(STU* head, char* name); extern STU* free_link(STU* head); #endif ``` 最后修改:2021 年 02 月 04 日 © 禁止转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏