这里不再赘述,直接上代码。

  1 #include <stdio.h>
  2 #include <malloc.h>
  3 #include <stdlib.h>
  4
  5 //引入头文件
  6
  7 typedef struct Node {
  8     int data;        //数据域
  9     struct Node * pNext; //指针域
 10 } NODE,*PNODE;
 11
 12 //声明一个结点类型
 13 PNODE create_list(void);
 14 void traverse_list(PNODE pHead);
 15 bool is_empty(PNODE pHead);
 16 int length_list(PNODE pHead);
 17 void sort_list(PNODE pHead);
 18 bool insert_list(PNODE pHead,int pos,int val);
 19 bool delete_list(PNODE pHead,int pos,int *val);
 20
 21
 22
 23
 24 //声明函数
 25
 26 int main(void) {
 27
 28     PNODE pHead = NULL;
 29     pHead = create_list();
 30     traverse_list(pHead);
 31     int len;
 32     len = length_list(pHead);
 33     printf("链表中共有%d个参数!\n",len);
 34     sort_list(pHead);
 35     traverse_list(pHead);
 36     insert_list(pHead,2,555);
 37     traverse_list(pHead);
 38     int val;
 39     delete_list(pHead,2,&val);
 40     traverse_list(pHead);
 41
 42     return 0;
 43 }
 44 //插入数据,创建一个链表
 45 PNODE create_list(void) {
 46     int len;  //用来存放有效节点的个数
 47     int i;
 48     int val; //用来临时存放用户输入的结点的值
 49     PNODE pNew;
 50     //分配了一个不存放有效数据的头结点
 51     PNODE pHead = (PNODE)malloc(sizeof(NODE));
 52     pHead->pNext = NULL;        //创建的时候定义一个头结点
 53     if (NULL == pHead) {
 54         printf("分配失败, 程序终止!\n");
 55         exit(-1);
 56     }
 57     PNODE pTail = pHead;    //如果需要实现 尾插法的话  就需要这个指向尾结点的指针了
 58     pTail->pNext = NULL;
 59     printf("请输入您需要生成的链表节点的个数: len = ");
 60     scanf("%d", &len);
 61     for (i=0; i<len; ++i) {
 62         printf("请输入第%d个节点的值: ", i+1);
 63         scanf("%d", &val);
 64         pNew = (PNODE)malloc(sizeof(NODE));
 65         pNew->pNext = NULL;
 66         if (NULL == pNew) {
 67             printf("分配失败, 程序终止!\n");
 68             exit(-1);
 69         }
 70         pNew->data = val;
 71         //这样能实现尾插法
 72 //        pNew->pNext = pHead->pNext;
 73 //        pHead->pNext = pNew;
 74         //头插法呢?
 75         pTail->pNext = pNew;
 76         pNew->pNext = NULL;
 77         pTail = pNew;     //这样就可以实现头插法了
 78     }
 79
 80     return pHead;
 81 }
 82 //打印出链表的所有元素   遍历
 83 void traverse_list(PNODE pHead) {
 84     PNODE p = pHead->pNext;  //头指针
 85
 86     while (NULL != p) {
 87         printf("%d  ", p->data);
 88         p = p->pNext;
 89     }
 90     printf("\n");
 91
 92     return;
 93 }
 94
 95 bool is_empty(PNODE pHead) {
 96     if(NULL == pHead->pNext) {   // 判断一个链表是不是空的 主要就是使用 头指针就行判断  一个头指针为空链表为空
 97         printf("链表为空!");
 98         return true;
 99     } else {
100         return false;
101     }
102 }
103 //打印出链表的长度
104 int length_list(PNODE pHead) {
105     PNODE p = pHead->pNext;
106     int len = 0;
107     while(NULL != p) {
108         p=p->pNext;
109         len++;
110     }
111     return len;
112 }
113
114 void sort_list(PNODE pHead) {
115     int i,j,t;
116     int len = length_list(pHead);
117     PNODE p,q;
118
119     //i和j控制循环次数  p和q控制指针的移动
120     for(i=0,p=pHead->pNext; i<len-1; i++, p=p->pNext) {
121         for(j=i+1,q=p->pNext; j<len; j++,q=q->pNext) {
122             if(p->data>q->data) {
123                 t = p->data;
124                 p->data = q->data;
125                 q->data = t;
126             }
127         }
128     }
129     return;
130 }
131 bool insert_list(PNODE pHead,int pos,int val) {
132
133     int i= 0;
134     PNODE p = pHead;
135     //前面一个就是说明他不是一个空的链表
136     //后面一个就是说明
137     while(NULL != p && i<pos-1) {
138         p=p->pNext;
139         i++;
140     }
141     if(p==NULL || i>pos-1) {
142         return false;
143     }
144     PNODE pNew = (PNODE)malloc(sizeof(NODE));
145     if(NULL == pNew) {
146         printf("动态分配内存失败!\n");
147         exit(-1);
148     }
149     pNew->data = val;
150     //插入的过程
151     pNew->pNext = p->pNext;
152     p->pNext = pNew;
153     return true;
154 }
155
156 //指定位置删除结点
157 bool delete_list(PNODE pHead,int pos,int *val) {
158     int i= 0;
159     PNODE p = pHead;
160     while(NULL != p->pNext && i<pos-1) {
161         p=p->pNext;
162         i++;
163     }
164     if(p->pNext==NULL || i>pos-1) {
165         return false;
166     }
167     PNODE q = p->pNext;
168     *val = q->data;
169     //先把删除的那个结点记录下来
170     p->pNext = p->pNext->pNext;
171     free(q);
172     //将指针往后移一位删除掉删除的那个元素
173     //然后再进行释放
174     q= NULL;
175     return true;
176 }

这应该是一个最原始的代码,如果楼主总结的有错误的话,请@楼主告知。谢谢!

转载于:https://www.cnblogs.com/strator/p/7232537.html

原始线性结构单链表的实现以及操作相关推荐

  1. python的线性链表_Python线性表——单链表-阿里云开发者社区

    Python线性表--单链表 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列.线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继, ...

  2. 数据结构_Java_基于 线性表-单链表的初始化、逆序、去重、非递减序列的合并(开辟新链表先整体插入一个链表全部元素,再遍历另外一个链表寻找合适位置插入 、开辟新链表实现舍弃原链表)等操作实现

    写在前面 不久前学习了数据结构线性表-数组-链表的相关知识,用C/C++语言实现了 单链表的系列相关操作 .见往期博客: 数据结构实验2_C语言_基于顺序表的非递减有序表的合并.线性表元素的增.删.改 ...

  3. 顺序表和单链表的插入删除操作时间复杂度的区别

    顺序表和单链表的插入删除操作时间复杂度的区别 最近在学习数据结构,看到如果需要用到大量的插入和删除操作,单链表的效率会高于顺序表.看到这里时内有有个疑惑,这两种数据结构的插入和删除操作的时间复杂度不都 ...

  4. Linux从入门到精通系列之线性表链式存储结构-单链表原理解析

    前言 线性表的链式存储结构的特点就是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以在内存中未被占用的任意位置. 比起顺序存储结构每个元素只需要存储一个位置就可以了.现在链式存储结构中,除了 ...

  5. 线性表之顺序结构单链表

    数据结构学习笔记 文章目录 数据结构学习笔记 一.线性表的链式存储结构之单链表 1.单链表存储结构要素 2.实现过程 二.读取操作 1.算法思路 2.算法实现 三.插入操作 1.算法思路 2.算法实现 ...

  6. (王道408考研数据结构)第二章线性表-第三节1:单链表的定义及其操作(插入和删除,建立之尾插和头插)

    文章目录 一:单链表相关 (1)单链表的定义 (2)头指针与头结点 二:单链表代码描述 三:单链表的初始化 四:单链表的插入 五:单链表的删除 六:单链表查找 (1)按位查找 (2)按值查找 七:单链 ...

  7. 第二章:2线性表---单链表表示和实现

    前言: 为避免在使用线性表顺序存储结构的时,需插入和删除需大量移动元素的弊端. 本节讨论线性表的另外一种表示方法---链式存储结构: 由于它不要求逻辑上相邻的元素在物理位置上相邻,因此它对元素的插入和 ...

  8. 线性表----单链表

    一,实验内容:链表的创建.插入与删除操作 二.程序清单 三.思考 l.如果需要将新结点 插入  到     第i个数据元素之后,算法将如何改动? 2. 双向链表和循环链表的定义和构造方法. //链表的 ...

  9. 理论基础 —— 线性表 —— 单链表

    [实现类] 单链表的基本思想就是用指针表示结点之间的逻辑关系,因此要正确的对指针变量.指针.指针所指结点.结点的值进行区分. 设 p 是一个指针变量,则 p 的值是一个指针,若指针 p 指向某个 No ...

最新文章

  1. Python-OpenCV 图像与视频处理
  2. php中的大括号用法
  3. javascript变量提前声明
  4. CSDN开播工具-嘉宾端使用说明
  5. 将WebApiTestClient添加到ASP.NET Web API帮助页面
  6. Neo4j:Cypher – Neo.ClientError.Statement.TypeError:不知道如何添加Double和String
  7. 计算机网络结构示意图,计算机网络原理-计算机网络体系结构.pdf
  8. 边缘计算(edge computing)中computation offloading、resource allocation、resource provisioning的区别
  9. 区块链技术:颠覆性革命浪潮的开始
  10. Apache 别名与重定向
  11. Spark Session 与 Spark Context的区别
  12. c语言邻接表存储拓扑排序,拓扑排序(完整案列及C语言完整代码实现)
  13. opengl编程指南
  14. 【哔哩哔哩笔试】顺时针打印数字矩阵
  15. 特征空间、(数据集)线性可分:线性(二分类)模型
  16. db2 reorg的四个阶段
  17. 最全面java面试题集
  18. 036-2018-1028 线程 效率对比 数据共享 同步锁死锁递归锁 守护线程 信号量
  19. openlayers根据半径绘制圆形,多圆连线并标记距离
  20. Ubuntu 服务器初始化、系统安全加固、系统内核参数优化以及常用软件安装脚本分享...

热门文章

  1. 圣经是上帝所默示和启示的
  2. centos7网卡编辑_CentOS7网卡命名中碰到的一个坑
  3. 一次函数的斜率公式_【海广教育数学口诀】初中数学学不会?公式这样记,让你做题效率翻倍!...
  4. c语言一次绑定多个控件,一入前端深似海,从此红尘是路人系列第九弹之如何实现一个双向数据绑定...
  5. python基础分析_python基础--函数全解析(1)
  6. Android 用MediaCodec ,MediaExtractor解码播放MP4文件
  7. 李迟2011年3月代码积累
  8. 【Flink】Discard registration from TaskExecutor SplitFetcher received unexpected exception
  9. 1.1.0-简介-P9-分布式ID生成器解决方案
  10. 【java】JVM Attach机制实现与jstack使用(jvm参数DisableAttachMechanism)