数据结构与算法基础之链表插入和删除算法

  1 #include<stdio.h>
  2 #include<malloc.h>
  3 #include<stdlib.h>
  4
  5 //函数声明
  6 PNODE create_list();//返回值是链表头结点的地址
  7 void traverse_list(PNODE pHead);
  8 bool is_empty(PNODE pHead);
  9 int length_list(PNODE pHead);
 10 bool insert_list(PNODE,int,int);//此处可以不定义形参,只声明形参类型
 11 bool delete_list(PNODE,int,int *);
 12 void sort_list(PNODE pHead);
 13
 14
 15 typedef struct Node{
 16     int data;//数据域
 17     struct Node * pNext;//指针域
 18 }NODE,*PNODE;//NODE等价于struct Node  PNODE等价于struct Node*
 19
 20 int main(){
 21     PNODE pHead = NULL;//等价于struct Node * pHead = NULL;
 22
 23     pHead = create_list();//创建一个非循环单链表,并将该链表的头结点的地址赋值给pHead
 24
 25     traverse_list(pHead);//遍历
 26
 27     sort_list(pHead);//排序
 28
 29     insert_list(pHead,4,33);在第个节点的位置插入数据33
 30
 31     int val;
 32     if(delete_list(pHead,4,&val)){
 33 //删除第四个节点的数据,并返回删除的数据,由于是直接在地址上操作,所以无需返回值
 34     printf("删除成功,删除的数据是%d",val);
 35     }
 36     else{
 37         printf("删除失败,数据不存在");
 38     }
 39     if(is_empty(pHead)){
 40         printf("链表为空");
 41     }
 42     else{
 43         printf("链表不空");
 44     }
 45
 46      int len = length_list(pHead);
 47      printf("链表长度是%d",len);
 48
 49
 50
 51     return 0;
 52 }
 53
 54 PNODE create_list(){
 55     int len;//有效节点的个数
 56     int i;
 57     int val;//临时存放用户输入的结点的值
 58
 59     //分配一个不存放有效数据的头结点
 60     PNODE pHead = (PNODE)malloc(sizeof(NODE));
 61     if(pHead==NULL){
 62         printf("分配失败,程序终止");
 63         exit(-1);
 64     }
 65
 66      PNODE pTail = pHead;
 67      pTail->PNext = NULL;//若只有一个结点,此时就为尾节点,指针域应当为空
 68     printf("链表节点个数:");
 69     scanf("%d",&len);
 70
 71     for(i=0;i<len;i++){
 72         printf("请输入第%d个节点的值:",i+1);
 73         scanf("%d",&val);
 74
 75         PNODE pNew = (PNODE)malloc(sizeof(NODE));//生成新结点
 76              if(pNew==NULL){
 77             printf("分配失败,程序终止");
 78             exit(-1);
 79         }
 80         pNew->data = val;//把数据存放进新结点的数据域
 81         pNew->pNext = NULL;//把新结点指针域赋值为空
 82         pTail->pNext = pNew;//把新结点地址赋值给尾节点指针域
 83         pTail = pNew;//最后一步把新结点地址复制给尾节点(就是让新结点成为尾节点)
 84        // pHead->pNext = pNew;
 85        // pNew->pNext=NULL;//最后一个结点的指针域为空
 86     }
 87     return pHead;
 88 }
 89
 90 void traverse_list(PNODE pHead){
 91     PNODE p = pHead->pNext;//若链表为空,则头结点指针域就为空,则p就为空
 92
 93     while(p!=NULL){
 94         printf("%d ",p->data);
 95         p=p->pNext;
 96     }
 97     printf("\n");
 98     return;
 99 }
100
101 bool is_empty(PNODE pHead){
102     if(pHead->pNext==NULL){//如果头结点的指针域为空,则链表为空
103         return true;
104     }
105     else{
106         return false;
107     }
108 }
109
110 int length_list(PNODE pHead){
111      PNODE p = pHead->pNext;
112      int len = 0;
113      while(p!=NULL){
114          len++;
115          p=p->pNext;
116      }
117 }
118
119 void sort_list(PNODE pHead){
120     int  i ,j , t;
121     int len = length_list(pHead);
122     PNODE p,q;
123     //重点!!!
124     for(i=0,p=pHead->pNext; i<len-1; i++,p=p->pNext){
125         for(j=j+1,q=p->pNext;j<len;j++,q=q->pNext){
126             if(p->data > q->data){ //类似于数组的:a[i]>a[j]
127                 t = p->data;          //t=a[i];
128                 p->data = q->data;    //a[i]=a[j];
129                 q->data = t;          //a[j]=t;
130             }
131         }
132     }
133 }
134
135 //在pHead所指向链表的第pos个节点前面插入新节点,值是val,pos从1开始
136 bool insert_list(PNODE pHead,int pos,int val){
137     int i = 0;
138     PNODE p=pHead;
139
140     while(p!=NULL&&i<pos-1){//找到第pos前面一个节点的指针域,所指向的为插入的节点位置
141         p=p->pNext;
142         i++;
143     }
144
145     if(i>pos-1||p==NULL){
146         return false;
147     }
148
149     PNODE pNew=(PNODE)malloc(sizeof(NODE));//动态分配内存生成一个新节点
150     if(pNew==NULL){
151         printf("动态分配内存失败");
152         exit(-1);
153     }
154     //重点
155     pNew->data = val;//把数据存放进插入的新结点的数据域
156     PNODE q=p->pNext;//临时节点q指向节点p的指针域,即插入新结点之后的节点地址
157     p->pNext=pNew;//节点p的指针域指向新节点地址
158     pNew->pNext=q;//新结点的指针域指向原来p节点的指针域
159
160     return true;
161 }
162
163 bool delete_list(PNODE pHead,int pos,int  *pVal){
164     int i = 0;
165     PNODE p=pHead;
166
167     while(p->pNext!=NULL&&i<pos-1){//找到要删除的第pos个节点之前的节点的指针域
168         p=p->pNext;        //假如要删除第五个节点,需要找到第四个节点的指针域,这样就指向了第五个节点
169         i++;
170     }
171
172     if(i>pos-1||p->pNext==NULL){
173         return false;
174     }
175
176      PNODE q=p->pNext;//临时节点q指向即将删除节点的地址(即p节点的指针域指向的节点),以便最后释放内存地址
177      *pVal = q->data;//保存即将删除节点的数据域
178      p->pNext=p->pNext->pNext;
179 //重新使p节点指向p节点之后节点的指针域(p节点后面的节点被删,所以p节点的下一个的下一个节点地址)
180      free(q);//释放q节点内存
181      q=NULL;
182      return true;
183 }

原文地址:https://www.cnblogs.com/sunbr/p/11324539.html

时间: 2024-08-29 22:41:44

数据结构与算法基础之链表插入和删除算法的相关文章

链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述

关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学习过算法的系统性的课程,现在还是处于不断摸索的阶段,好多算法题目根本就没有什么思路,导致自己对好多题目都很是头疼,就算是自己做过的一些算法的题目,再次遇到也还是不一定会做出来,他给出的建议就是,看懂别人的程序,然后自己去敲,一定会出错,然后调试,有错误接着调试,一直到没有错误为止,并且要时常的去复习

用C语言实现顺序表的插入和删除算法

什么是线性表? 线性表是n个数据元素的有限序列.根据线性表的显现方式,线性表又分为顺序表(数据元素在内存中的存储空间是连续的)和链表(数据元素在内存中的存储空间是不连续的). 线性表如何用C语言实现?线性表可以进行哪些操作? 在C语言中,线性表通过结构体的方式来实现.结构体中定义了线性表的存储空间地址,当前长度,和当前分配的存储容量.操作包含在指定位置插入某一元素.删除指定元素.查找指定的元素等.在这里重点介绍插入和删除算法. 下面就是关于这一部分内容的陈述. 线性表的C语言实现 需要先定义好的

重温数据结构:二叉排序树的查找、插入、删除

读完本文你将了解到: 什么是二叉排序树 Binary Sort Tree BST 二叉排序树的关键操作 查找 插入 删除 运行代码测试 一道面试题 总结 Thanks 我们知道,二分查找可以缩短查找的时间,但是有个要求就是 查找的数据必须是有序的.每次查找.操作时都要维护一个有序的数据集,于是有了二叉排序树这个概念. 上篇文章 我们介绍了 二叉树 的概念,二叉树有左右子树之分,想必在区分左右子树时有一定的规则. 现在我们来介绍二叉树的一种特殊形式 - 二叉排序树,了解它的区分策略及常用操作. 什

c++ 提高4 map容器 共性机制 使用时机 比较| STL算法 算法基础仿函数 谓词 函数适配器 遍历算法

[本文谢绝转载] <大纲> STL 容器 map 容器的4中初始化 遍历 map容器 元素的删除观测map.insert返回值,方法123,已存在就报错,初始化方法4会覆盖 map的查找,异常处理 map容器的range返回两个迭代器 multimap案例,按照部门_增删员工信息 容器共性机制 把对象放到容器中,会自动执行拷贝构造函数 各个容器的使用时机 vector与deque的比较: 算法 算法基础 函数对象(仿函数) 函数对象 与普通函数的区别:--  相同之处 函数对象 与普通函数的区

数据结构-编程实现一个单链表节点的删除

1:代码如下: // ConsoleApplication15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <malloc.h> #include <iostream> using namespace std; typedef struct node//定义链表结构体 { int data;//节点内容 node *next;//指向结构体的指针,下一个节点 }node; node *create()

单链表 - 插入和删除操作

下图展示了单链表的基本结构: head指针是链表的头指针,指向第一个节点,每个节点的next指针域指向下一个节点,最后一个节点的next指针域为NULL,在图中用0表示. 下面先来看程序(栈的链式存储实现,另外一个实现点这里)和对应的输出(注意输出前进行了链表反转(见<单链表反转>,否则程序后面的while循环输出的顺序是250,200,100),接着来分析程序: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

顺序表插入、删除算法用C语言来实现

#include<stdio.h> #include<stdlib.h> //-------- 线性表的动态分配顺序存储结构 ----------- int LIST_INIT_SIZE=100;   //顺序表存储空间初始尺寸 int LISTINCREMENT=10;  //顺序表存储空间分配增量 typedef  int  ElemType;          //顺序表元素的数据类型为整数 //存储结构定义:顺序表 typedef struct { ElemType *el

数据结构Java实现03----单向链表的插入和删除

数据结构Java实现03----单向链表的插入和删除 文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构:            概念: 链式存储结构是基于指针实现的.我们把一个数据元素和一个指针称为结点.   数据域:存数数据元素信息的域. 指针域:存储直接后继位置的域. 链式存储结构是用指针把相互直接关联的结点(即直接前驱结点或直接后继结点)链接起来.链式存储结构的线性表称为链表. 链表类型: 根据链表的构造方式的不同可以分为: 单向链表 单向循环链表 双向循环链表 二

数据结构Java实现03----单向链表

文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构:            概念: 链式存储结构是基于指针实现的.我们把一个数据元素和一个指针称为结点.   数据域:存数数据元素信息的域. 指针域:存储直接后继位置的域. 链式存储结构是用指针把相互直接关联的结点(即直接前驱结点或直接后继结点)链接起来.链式存储结构的线性表称为链表. 链表类型: 根据链表的构造方式的不同可以分为: 单向链表 单向循环链表 双向循环链表 二.单链表: 概念: 链表的每个结点中只包含一个指针域,