Loading... 1. 输入一个结构节点(这个值可以重复输入)![](https://blog.fivk.cn/usr/uploads/2021/01/1302674693.png) 2. 将输入的结构进行传递 3. 给带插入的节点申请堆区空间 4. 给申请的空间节点赋值 5. 将申请的空间节点插入 * 1-5就插入了一个节点 * 继续重复1-5,可以实现插入多个节点形成链表 * 应为要重复输入利用第1步的节点重复输入 <div class="tip inlineBlock success"> 切记:输入->传递->申请->赋值->插入 </div> **保存文件:** * 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) { printf("_______search______"); } else if (strcmp(cmd, "delete") == 0) { printf("_______delete______"); } else if (strcmp(cmd, "free") == 0) { printf("_______free______"); } else if (strcmp(cmd, "quit") == 0) { 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" 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 #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、将节点插入到链表的尾部 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; } #endif //链表的有序插入 以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; } 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; } ``` * 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); #endif ``` 最后修改:2021 年 03 月 14 日 © 禁止转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏