数据结构笔记:3.4.1 链表的应用:倒置链表

    技术2025-07-30  16

    1、倒置链表程序

    void Invertion(LinkList L) {/*倒置链表*/ LinkList p, q, s; p = L->next; /*指向链表中的第一个数据*/ q = p->next; /*指向链表中的第二个数据*/ s = q->next; /*指向链表中的第三个数据*/ p->next = NULL;/*将第一个数据结点的指针置空*/ while (s->next) {/*当存在下一个结点不为空时,则运行交换结点的顺序*/ q->next = p; /*让下一个遍历到的新的结点的指针,指向其上一个结点*/ p = q;/*存储逆置数据的链表的头指针指向新插入的结点*/ q = s; /*q指向下一个新的结点*/ s = s->next; /*s指向下一个结点*/ } q->next = p; /*当只剩下两个结点后,分别将最后两个个结点的指针指向上一个结点*/ s->next = q; L->next = s;/*链表的头指针指向存储逆置链表的第一个结点*/ }

    2、分析图 3、测试代码(编译环境Visual Studio 2017)

    #include<stdio.h> #include<stdlib.h> typedef int ElenType;/*线性表中存储的数据类型*/ typedef struct Node {/*线性表的单链表存储结构*/ ElenType data; struct Node *next; }Node; typedef struct Node *LinkList;/*定义指针*/ void Initialize(LinkList *L) {/*初始化链表指针:分配空间*/ *L = (LinkList)malloc(sizeof(Node)); (*L)->next = NULL; } void Display(LinkList L) {/*输出链表中的数据*/ LinkList p = L->next; if (!p) printf("链表为空!\n"); else { while (p) { printf("%d ", p->data); p = p->next; } putchar('\n'); } } void create(LinkList L) {/*初始化链表:输入初始化的数据*/ int i,j=1; LinkList p, q; p = L; printf("请输入需要初始化的数据个数:"); scanf_s("%d", &i); while (j <= i) { q = (LinkList)malloc(sizeof(Node)); printf("请输入第%d个数据:",j); scanf_s("%d", &q->data); p->next = q; p = p->next; j++; } p->next = NULL; } void Invertion(LinkList L) {/*倒置链表*/ LinkList p, q, s; p = L->next; /*指向链表中的第一个数据*/ q = p->next; /*指向链表中的第二个数据*/ s = q->next; /*指向链表中的第三个数据*/ p->next = NULL;/*将第一个数据结点的指针置空*/ while (s->next) {/*当存在下一个结点不为空时,则运行交换结点的顺序*/ q->next = p; /*让下一个遍历到的新的结点的指针,指向其上一个结点*/ p = q;/*存储逆置数据的链表的头指针指向新插入的结点*/ q = s; /*q指向下一个新的结点*/ s = s->next; /*s指向下一个结点*/ } q->next = p; /*当只剩下两个结点后,分别将最后两个个结点的指针指向上一个结点*/ s->next = q; L->next = s;/*链表的头指针指向存储逆置链表的第一个结点*/ } void Menu() {/*程序菜单*/ printf("程序的功能菜单:\n0:菜单\n1:创建链表\n2:倒置链表\n3:退出程序\n"); } int main(void) { int i = 0; LinkList L; while (i != 3) { switch (i) { case 0: Menu(); break; case 1: Initialize(&L); create(L); printf("链表中的数据为:"); Display(L); break; case 2: Invertion(L); printf("链表中的数据为:"); Display(L); break; default: printf("不存在该功能选项!\n"); break; } printf("请输入需要执行的选项:"); scanf_s("%d", &i); } printf("感谢您的使用!\n"); return 0; }

    运行结果

    Processed: 0.026, SQL: 10