Loading... ## 链表插入元素 链表中插入元素分为三种,分别是在链表头部插入元素,在链表中间插入元素以及在链表尾部插入元素。需要注意的这里的链表的位置指的在p位置插入元素,在插入完成之后,链表的p位置指向的是新的节点。 ## 在链表的头部插入新的节点  其逻辑步骤是: * 首先将新的节点的指针指向表头节点 * 将表头节点指向新的节点 ## 在链表尾部插入节点  在链表尾部插入新的节点也非常简单,需要将新的节点的NEXT 指针指向NULL,然后将原链表的尾指针执行新节点,即可。 ## 在链表中间插入节点  * 首先定位到需要插入的节点位置,断开其 Next 节点,注意需要保存 Next 节点的引用 * 将当前节点的 Next 指针执行新的节点 * 将新节点的 Next 指针指向 Next 节点 ```cpp #include <stdio.h> #include <stdlib.h> struct Student { int num; char name[10]; int result[3]; struct Student *next; }; int main () { struct Student *creat (), *increases (struct Student *head , struct Student *student), *student();//创建链表函数 结构体指针 删除结点函数 创造结点函数 增加结点函数 struct Student *head, *heado, *w, *c; void print (struct Student *head);//输出链表 函数 struct Student *deletes ();//删除链表结点 函数 int n, commond;//n为输入的学号 printf ("请先录入学生信息!\n"); head = creat (); while (1) { printf ("输入1,输出全体学生信息\n输入2,删除学生信息\n输入3,增加学生信息\n输入0,结束此系统\n"); printf ("请输入命令!"); scanf ("%d", &commond); if (commond == 0) { break; } switch (commond) { case 1 : { print (head);//输出 链表 break; } case 2: { while ( 1 ) { printf ("停止删除请输入:0\n"); printf ("请输入需要删除的学号:\n"); scanf ("%d", &n); if ( n == 0 ) { break; } heado = deletes (head, n); printf ("删除结点后的新链表为:\n"); print (heado);//输出删除链表中结点的新链表 } break; } case 3: { while (1) { w = student(); if ( w->num == 0) { printf ("已停止删除功能!\n"); break; } c = increases (head , w); print (c);//输出增加结点后的新链表 } break; } default : { printf ("请输入正确的命令!\n"); } } } } struct Student *creat() { struct Student *a, *b, *p, *head; int n = 0; a = b = malloc (sizeof (struct Student)); head = NULL; printf ("请输入第1个成员数据,学号 名字 语文 数学 英语,这样的格式输入: \n"); scanf("%d %s %d %d %d", &a->num, &a->name, &a->result[0], &a->result[1], &a->result[2]); while (a->num != 0) { n++; if (n == 1) { head = a; } else { b->next = a; b = a; a = malloc (sizeof (struct Student)); printf ("请输入第%d个成员数据,学号 名字 语文 数学 英语,这样的格式输入: \n", n); scanf("%d %s %d %d %d", &a->num, &a->name, &a->result[0], &a->result[1], &a->result[2]); } } b->next = NULL; return head; } void print (struct Student *head) { struct Student *p; p = head; if (head != NULL) { while (p != NULL) { printf ( "%-5d %-5s %-5d %-5d %-5d",p->num, p->name, p->result[0], p->result[1], p->result[2]); printf ("\n\n"); p = p->next; } } } struct Student *deletes (struct Student *head , int n) { struct Student *p, *d; p = head; if (head!=NULL)//判断链表不为空链表 { while (p->num!=n)//寻找删除的结点位置 { d = p; p = p->next; } if (n == p->num)//如果找到则 { if (p == head)//判断该结点是否为头结点 { head = p->next;//当该结点为头结点则把头结点指向的下一个结点赋予给头结点,新的领头羊诞生 } else if( p->next == NULL) { d->next = NULL; } else { d->next = p->next;//反之,把找的的结点的前一个结点链接到 找到的下一个结点的地址去 } } } return head; } struct Student *student() { struct Student *p1; p1 = malloc (sizeof (struct Student)); printf ("请输入待插入的学生信息((若连续输入5个0将结束插入)):\n") ; scanf("%d %s %d %d %d", &p1->num, &p1->name, &p1->result[0], &p1->result[1], &p1->result[2]); return p1; } struct Student *increases (struct Student *head , struct Student *increase )//链表的结点插入函数 { struct Student *p, *q, *p0; p = head; p0 = increase; if (head != NULL) //判断结点不为空链表 { while( (p->num < p0->num) && (p->next !=NULL))//循环判断链表中的学号是否小于插入的结点学号 并且 还要是链表中的结点不链接为NULL { q = p; p = p->next;//持续判断 } if (p->num >= p0->num)//当链表中某结点学号大于或者等于插入的结点学号执行判断 { if (p == head)//判断结点是否为头结点,如果为头结点,则将待插入结点作为头结点 { head = p0; p0->next = p; } else//如不为头结点,则在中间插入结点 { q->next = p0; p0->next = p ; } } else//当在链表的各结点中学号中 找不到大于 待插入结点学号 , 则在链尾插入结点 { p->next = p0; p0->next =NULL; } } else//如果链表为空链表,则把增加的结点作为链表中头结点 { head = p0; p0->next =NULL; } return head; } ``` 最后修改:2021 年 06 月 01 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果文章有用,请随意打赏。