#include <stdio.h> #include <stdlib.h> typedef int ElemType; // 定义链表节点结构体 typedef struct LNode { ElemType data; // 数据域,存储元素值 struct LNode *next; // 指针域,指向下一个节点 } LNode, *LinkList; // 尾插法建立链表 void list_fail_inster(LinkList &L) { L = (LinkList) malloc(sizeof(LNode)); // 为新链表开辟一段存储空间 L->next = NULL; // 将头节点的指针域指向空,表示链表为空 ElemType x; // 定义一个变量,用来暂存输入的数字 LinkList s, r = L; // 定义两个指针变量s和r,r始终指向链表的末尾节点 scanf("%d", &x); // 读取用户输入的第一个数字 while (x != 9999) { // 如果用户输入的数字不等于9999,则继续循环 s = (LinkList) malloc(sizeof(LNode)); // 为新节点分配空间 s->data = x; // 将用户输入的数字存储到新节点的数据域中 r->next = s; // 将新节点连接到链表的末尾 r = s; // 将r指向新的末尾节点 scanf("%d", &x); // 继续读取用户输入的下一个数字 } r->next = NULL; // 最后一个节点的指针域指向空,表示链表结束 } // 按位置查找第i个元素 LinkList find_location(LinkList L, int SearchPos) { // 首先判断位置是否合法 int i = 1; // 初始化计数器 LinkList p = L->next; // 从链表的第一个节点开始查找 if (SearchPos == 0) { // 如果查找的位置为0,直接返回头节点 return L; } if (SearchPos < 1) { // 如果查找的位置小于1,表示位置不合法,返回NULL return NULL; } while (p && i < SearchPos) { // 循环查找直到找到目标位置或者到达链表末尾 p = p->next; // 移动到下一个节点 i++; // 计数器加1 } return p; // 返回找到的节点或者NULL(如果位置不合法或者超出链表范围) } // 修改第i个位置的节点值为e bool change_location(LinkList L, int i, ElemType e) { LinkList p = find_location(L, i - 1); // 找到要修改节点的前一个节点 if (NULL == p) { // 如果前一个节点不存在,说明位置不合法,返回false return false; } LinkList q; q = (LinkList) malloc(sizeof(LNode)); // 创建一个新节点 q->data = e; // 设置新节点的数据域为e q->next = p->next; // 新节点指向原来位置i的节点 p->next = q; // 前一个节点指向新节点,完成插入操作 return true; // 返回true表示修改成功 } // 删除第i个位置的节点 bool delete_location(LinkList L, int i) { LinkList s = find_location(L, i - 1); // 找到要删除节点的前一个节点 if (NULL == s) { // 如果前一个节点不存在,说明位置不合法,返回false return false; } LinkList t; t = s->next; // t指向要删除的节点 if (NULL == t) { // 如果要删除的节点不存在,说明位置不合法,返回false return false; } s->next = t->next; // 前一个节点指向要删除节点的下一个节点,跳过要删除节点 free(t); // 释放要删除节点的内存空间 t = NULL; // 避免野指针 return true; // 返回true表示删除成功 } //打印链表 void print_list(LinkList L){ L=L->next; while (L!=NULL){ printf("%3d",L->data); L=L->next; } printf("\n"); } int main() { LinkList L, search; list_fail_inster(L); // 构建链表 search = find_location(L, 2); // 查找第二个位置的节点 if (search != NULL) { printf("%d\n", search->data); // 输出查找到的节点数据 } change_location(L, 2, 99); // 修改第二个位置的节点为99 print_list(L); // 打印链表 delete_location(L, 4); // 删除第四个位置的节点 print_list(L); // 打印链表 return 0; }
输入3 4 5 6 7 9999一串整数,9999代表结束,通过尾插法新建链表,查找第二个位置的值并输出,在2个位置插入99,输出为 3 99 4 5 6 7,删除第4个位置的值,打印输出为
最新推荐文章于 2024-09-05 11:30:11 发布