废话少说,先上代码:

#include <stdio.h>
#include <stdlib.h>typedef struct Node
{int data;struct Node* pNext;
}NODE,*PNODE;PNODE create_list(void);                          //初始化链表
void traverse_list(PNODE pHead);                  //为链表添加元素
bool is_empty(PNODE pHead);                       //判断是否为空链表
int length_list(PNODE pHead);                     //求链表的长度
void sort_list(PNODE pHead);                      //排序
bool insert_list(PNODE pHead, int pos, int val);  //插入
bool delete_list(PNODE pHead, int val);           //删除int main(void)
{int length;PNODE pHead = NULL;pHead = create_list();traverse_list(pHead);if (is_empty(pHead)){printf("链表是空链表!\n");}else{printf("链表不是空链表!\n");}length = length_list(pHead);printf("排序后链表为:\n");sort_list(pHead);traverse_list(pHead);insert_list(pHead, 3, 3);printf("在链表第三个元素前插入3之后得到的链表为:\n");traverse_list(pHead);delete_list(pHead, 3);printf("删除链表中数字域存储为3的值得到的链表为:\n");traverse_list(pHead);return 0;
}PNODE create_list(void)
{int length;int i;int value;PNODE pHead = (PNODE)malloc(sizeof(NODE));if (pHead == NULL){printf("内存分配失败!");exit(1);}PNODE pTail = pHead;pTail->pNext = NULL;printf("请输入链表的有效长度:\n");scanf_s("%d", &length);for (i = 0; i < length; i++){printf("请输入第%d个元素的值:\n", i + 1);scanf_s("%d", &value);PNODE pNew = (PNODE)malloc(sizeof(NODE));if (pNew == NULL){printf("内存分配失败!");exit(1);}pNew->data = value;pTail->pNext = pNew;pNew->pNext = NULL;pTail = pNew;}return pHead;
}void traverse_list(PNODE pHead)
{PNODE p = pHead->pNext;while (p != NULL){printf("%d ", p->data);p = p->pNext;}putchar('\n');
}bool is_empty(PNODE pHead)
{if (pHead->pNext == NULL){return true;}else{return false;}
}int length_list(PNODE pHead)
{int i = 0;PNODE p = pHead;while (p->pNext != NULL){i++;p = p->pNext;}return i;
}void sort_list(PNODE pHead)
{int i, j, temp;int length = length_list(pHead);PNODE p, q;for(i = 0,p = pHead->pNext; i < length; i++,p = p->pNext){for(j = i + 1, q = p->pNext; j < length;j++, q = q->pNext){if (p->data > q->data){temp = p->data;p->data = q->data;q->data = temp;}}}
}bool insert_list(PNODE pHead, int pos, int val)
{int i = 0;PNODE p = pHead;while (p != NULL && i < pos - 1){p = p->pNext;i++;}if (i > pos - 1 || p == NULL){printf("插入失败!\n");return false;}PNODE pNew = (PNODE)malloc(sizeof(NODE));if (pNew == NULL){printf("动态内存分配失败!\n");exit(1);}pNew->data  = val;pNew->pNext = p->pNext;p->pNext = pNew;return true;
}bool delete_list(PNODE pHead, int val)
{int i = 0;int length;PNODE p = pHead;PNODE q = (PNODE)malloc(sizeof(NODE));if (q == NULL){printf("内存分配失败!\n");exit(1);}q = p->pNext;length = length_list(pHead);  //链表被删除一个元素后长度会减小while (i < length)            //while(i<length_list(pHead))中length_list(pHead)减少一个就会相应减少,导致最后几个元素无法被选中{if (q->data == val){PNODE del = q;q = q->pNext;p->pNext = p->pNext->pNext;free(del);}else{p = q;q = p->pNext;}i++;}return true;
}

注:写完编译器还是一直给我报一个问题,使用未初始化的内存“*q”。求大佬解答!!!

无论是初始化链表还是改动链表,都是对链表的数据域和指针域进行改动。

1、初始化链表

首先要给头指针分配动态内存,头指针指向的就是第一个元素,新增加元素的指针设为pNew,那么当链表长度为0时可以直接添加pNew,而链表有长度时,通过头指针无限指向pNext(指针域)来添加就使程序变得难以理解,不如增加一个结点,把该结点(尾结点)的指针pTail指向新增结点,从而达到链表结点的增加。

PNODE create_list(void)
{int length;int i;int value;PNODE pHead = (PNODE)malloc(sizeof(NODE));if (pHead == NULL){printf("内存分配失败!");exit(1);}PNODE pTail = pHead;pTail->pNext = NULL;printf("请输入链表的有效长度:\n");scanf_s("%d", &length);for (i = 0; i < length; i++){printf("请输入第%d个元素的值:\n", i + 1);scanf_s("%d", &value);PNODE pNew = (PNODE)malloc(sizeof(NODE));if (pNew == NULL){printf("内存分配失败!");exit(1);}pNew->data = value;pTail->pNext = pNew;pNew->pNext = NULL;pTail = pNew;}return pHead;
}

返回头结点就能得到整个链表的所有结点。

2、排序(从小到大)

利用两个循环进行比较,如果左边的值小于右边则进行互换。

void sort_list(PNODE pHead)
{int i, j, temp;int length = length_list(pHead);PNODE p, q;for(i = 0,p = pHead->pNext; i < length; i++,p = p->pNext){for(j = i + 1, q = p->pNext; j < length; j++, q = q->pNext){ if (p->data > q->data){temp = p->data;p->data = q->data;q->data = temp;}}}
}

3、插入

在第pos个结点上插入一个值(数据域)为val的结点

bool insert_list(PNODE pHead, int pos, int val)
{int i = 0;PNODE p = pHead;while (p != NULL && i < pos - 1){p = p->pNext;i++;}if (i > pos - 1 || p == NULL){printf("插入失败!\n");return false;}PNODE pNew = (PNODE)malloc(sizeof(NODE));if (pNew == NULL){printf("动态内存分配失败!\n");exit(1);}pNew->data  = val;pNew->pNext = p->pNext;p->pNext = pNew;return true;
}

注意的是特殊情况,如果pos小于1或者大于链表长度+1那么无法插入。

pos结点前p的指针域指向pNew,pNew的指针域指向原来p指向的结点。

4、删除

删除每个值为val的结点删除后前结点直接指向被删除结点的后结点,并把被删除结点内存释放掉。

bool delete_list(PNODE pHead, int val)
{int i = 0;int length;PNODE p = pHead;PNODE q = (PNODE)malloc(sizeof(NODE));if (q == NULL){printf("内存分配失败!\n");exit(1);}q = pHead->pNext;length = length_list(pHead);  //链表被删除一个元素后长度会减小while (i < length)            //while(i<length_list(pHead))中length_list(pHead)减少一个就会相应减少,导致最后几个元素无法被选中{if (q->data == val){PNODE del = q;q = q->pNext;p->pNext = p->pNext->pNext;free(del);}else{p = q;q = p->pNext;}i++;}return true;
}

注:写这个算法的时候偷懒直接写while(i <length_list(pHead)),这样写当删除一个元素时长度减少,循环次数减少导致无法对后面的结点进行判断!!!应当把长度length直接求出来,进行length次循环才能找到全部的值为val的结点。

数据结构-链表:对链表进行初始化、增删改查相关推荐

  1. 逆向行驶!数据结构双向链表DoubleLinkedList,Java实现增删改查

    文章目录 节点类 链表类 测试类 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后 ...

  2. (数据结构与算法)单链表与双链表增删改查的实现。

    文章目录 链表介绍 1. 单链表应用实例 1.1 实现思路 1.2 代码实现 2.单链表常见面试题 2.1 求单链表中有效节点的个数 2.2 查找单链表中倒数第K个节点 2.3 单链表的反转 2.4 ...

  3. java单链表 提供增删改查_java实现单链表增删改查的实例代码详解

    package 数据结构算法.链表; /* *定义节点 * 链表由节点构成 */ public class node { private e e; //数据data private node next ...

  4. 数据结构----单链表增删改查

    单链表的增删改查 一.链表(Linked List) 链表是有序列表,以节点的方式来存储的,链式存储: 每个节点包含data域,next域:指向下一节点: 链表的各个节点不一定是连续存储: 链表分为带 ...

  5. 数据结构单链表SingleLinkedList,Java实现单链表增删改查

    文章目录 链表介绍 应用示例 链表介绍 链表是有序的列表,但是它在内存中是存储是不连续的,如下: 链表是以节点的方式来存储,是链式存储: ①每个节点包含data域存储数据,next域指向下一个节点 ② ...

  6. 数据结构,单链表讲解,并使用Java代码实现单链表增删改查【尾部添加,中间插入、修改节点、删除节点、展示链表】

    文章目录 单链表 什么是单链表,链式存储结构详解 链表的节点 头节点,头指针和首元节点 单链表的实现 1.尾部添加新节点 思路分析 代码实现 注意事项 2.按照编号插入新节点 思路分析 代码实现 注意 ...

  7. 三、单链表增删改查原理和代码实现

    单链表 1.简单介绍 (1)单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素 ...

  8. 单链表LinkedList的增删改查

    数组作为数据存储结构有一定的缺陷.在无序数组中,搜索性能差,在有序数组中,插入效率又很低(插入位置后面的元素需要集体后移),而且这两种数组的删除效率(集体前移)都很低,并且数组在创建后,其大小是固定了 ...

  9. Java程序-单链表增删改查(实现对水浒人物的增删改查操作)

    单链表增删改查(实现对水浒人物的增删改查操作) 前言 一.链表(Linked List)介绍 二.应用实例 1.问题描述 2.代码实现 总结 前言 参考:B站,尚硅谷数据结构与算法 课程 一.链表(L ...

  10. 带头节点单链表的增删改查

    单链表有很多结构循环单链表,有头节点的单链表,无头节点的单链表,双节点单链表,以下源码是以有一个头节点的单链表为例写的增删改查的各种功能,就是下图 然后各个注释也在函数后面写着,这玩意确实还挺难,源码 ...

最新文章

  1. 硬件丨十大人工智能芯片厂商
  2. python 源码安装教程_python安装步骤
  3. 中国年度AI省市格局:北广上稳居前三,江苏四川力压浙江,山西转型“挖数据”增速迅猛...
  4. 厦大诚招青年AI科学家:待遇不一般,连配偶和子女教育都考虑到了
  5. 庖丁解牛-图解MySQL 8.0优化器查询解析篇
  6. mysql的高阶用法_MySQL的经典用法(十四)-高级优化
  7. 珠心算测验(洛谷-P2141)
  8. Java并发编程:同步容器
  9. Java架构-高并发的解决实战总结方案
  10. AI+教育落地,百度大脑如何让校园更智能?
  11. python创建子窗口_python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
  12. python线程和c++线程的区别_python 多线程和C++多线程的区别
  13. 丢掉Axure,大厂PM最通用的原型设计工具
  14. 前端视觉测试工具:Applitools Eyes
  15. 怎么用计算机搜索文件夹,如何在电脑中查找文件_如何在电脑里查找文件-win7之家...
  16. 约瑟夫环(数三退一)
  17. vpu测试_联发科P30支持的VPU是什么?不知道就别说你懂科技了
  18. POJ 3265 Problem Solving 动态规划
  19. Java-SpringBoot-养老驿站管理系统-毕业设计
  20. linux考试不及格反思100字,考试不好的检讨书100字(精选7篇)

热门文章

  1. 字符集编码(四):UTF
  2. 不忘初心,方得始终——NOIP2016前的感悟
  3. html5 video speed control插件,谷歌浏览器插件Video Speed Manager 视频速度控制插件
  4. 《游戏学习》| 3d网页小游戏 | 公路赛车 源码
  5. JavaScript像素鸟案例
  6. c语言成绩筛选,c语言筛选质数
  7. 7、ARM嵌入式系统:LCD/数码管/OLED初始化
  8. 王姨劝我学HarmonyOS鸿蒙2.0系列教程之一环境搭建跑起来模拟器!
  9. 4.10nbsp;经济周期和经济危机
  10. oracle 索引命中条件,Oracle索引命中与扫描规律总结 | 学步园