链表删除功能实现演示

插入算法和删除演示:

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>typedef struct Node {int data;  //数据域struct Node * pNext;   //指针域}Node, *pNode;//函数声明
pNode create_list();
void traverse_list(pNode  pHead);      //遍历bool is_empty(pNode pHead);          //判断链表是否为空
int length_list(pNode pHead);        //链表的长度
bool insert_list(pNode, int, int);   //插入  第一个参数表示插入的链表  第二个参数表示插入的位置  第三个参数表示插入的元素
bool delete_list(pNode, int, int *); //第一个参数表示要删除的位置,第二个参数表示要删除的位置 第三参数表示删除的元素的地址放入指针
void sort_list(pNode pHead);int main(void) {pNode  pHead = NULL;   //等价于 struct Node *pHead=NULLpHead = create_list();    //create_list()创建一个非循环单链表,并将该链表的头结点的地址赋给pHeadtraverse_list(pHead);     //遍历输出/**int len = length_list(pHead);printf("链表的长度%d\n", len);sort_list(pHead);      //选择排序traverse_list(pHead);  //遍历输出*/insert_list(pHead, 4, 33);traverse_list(pHead);//遍历输出int val;if (delete_list(pHead, 4, &val)) {printf("删除成功,删除的元素%d:\n",val);}else {printf("删除失败,删除的元素不存在%d:\n",val);}traverse_list(pHead);//遍历输出while(true){}return 0;
}//创建单链表
pNode create_list() {int len;   //用来存放有效节点数int i;int val; //存放用户临时输入的节点数据//我们首先要先生成一个头结点  不存放有效数据pNode pHead = (pNode)malloc(sizeof(Node));if (NULL == pHead) {printf("内存分配失败");//程序退出exit(-1);}pNode pTail = pHead;    //pTail也指向了头结点pTail->pNext = NULL;printf("请输入你要输入节点的个数 len =");scanf_s("%d", &len);//假设输入的长度5,我们需要循环for ( i = 0; i < len; i++){printf("请输入第%d个节点的值:", i + 1);scanf_s("%d", &val);pNode pNew=(pNode)malloc(sizeof(Node));if (NULL == pNew) {printf("内存分配失败");//程序退出exit(-1);}pNew->data = val;//pHead->pNext = pNew;//pNew->pNext = NULL;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;}//换行printf("\n");return;
}//判断链表是否为空
bool is_empty(pNode pHead) {if (NULL == pHead->pNext) {return true;}else {return false;}
}//求一个链表的长度
int length_list(pNode pHead) {pNode p=pHead->pNext;   //第一个节点int len = 0;while (NULL != p) {   //只要指针指向的下一个元素不是空,指针就继续向后移动++len;p=p->pNext;}return len;
}//排序算法
void sort_arr(pNode pHead) {int i, j, tmp;int arr[6] = { 5,8,45,2,9,3 };int len=length_list(pHead);  //获取链表长度pNode p, q;for (i = 0; i < len-1; i++){for (j = i+1; j < len; j++){}}}//选择排序  从小到大排
void sort_list(pNode pHead){int i,j,t;int len = length_list(pHead);  //获取链表长度pNode p,q;for (i = 0, p = pHead->pNext; i < len - 1; ++i, p = p->pNext){for (j = i + 1, q = p -> pNext; j < len; ++j, q = q->pNext) {if (p->data > q->data) {        //类似于 数组中的: a[i] > a[j]t = p->data;                //类似于数组中的: t = a[i];p->data = q->data;          //类似于数组中的: a[i] = a[j];q->data = t;                // 类似于数组中的: a[j] = t;}}}
}//在pHead所指向链表的第pos个节点的前面插入-一个新的结点,该节点的值是val,并 且pos的值是从1开始
bool insert_list(pNode pHead, int pos, int val) {int i = 0;pNode p = pHead;while (NULL != p && i < pos - 1) {p = p->pNext;++i;}if (i > pos - 1 || NULL == p) {return false;}pNode pNew = (pNode)malloc(sizeof(Node));if(NULL == pNew){printf("动态分配内存失败!");exit(-1);}pNew->data = val;//定义一个临时节点,数据交换存储pNode tmp = p->pNext;p->pNext=pNew;pNew->pNext = tmp;return true;}bool delete_list(pNode pHead, int pos, int * val) {int i = 0;pNode p = pHead;while (NULL != p->pNext && i < pos - 1) {p = p->pNext;++i;}if (i > pos - 1 || NULL == p->pNext) {return false;}pNode tmp=p->pNext;  //将需要删除的节点临时保存起来*val = tmp->data;p->pNext = p->pNext->pNext;   //删除p节点后一个节点free(tmp);tmp = NULL;return true;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

栈入门

线性结构的两种常见应用之一栈 定义&#xff1a;一种可以实现”先进后出”的存储结构&#xff0c;栈类似于箱子 分类&#xff1a;静态栈、动态栈 算法&#xff1a;出栈、压栈 栈的定义&#xff1a; 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;它是一种运算受限的线性…

Packet Tracer 5.0实验(四) 利用三层交换机实现VLAN间路由

一、实验目标 掌握交换机Tag VLAN 的配置&#xff1b;掌握三层交换机基本配置方法&#xff1b;掌握三层交换机VLAN路由的配置方法&#xff1b;通过三层交换机实现VLAN间相互通信&#xff1b;二、实验背景 某企业有两个主要部门&#xff0c;技术部和销售部&#xff0c;分处于不同…

栈程序演示

#include <stdio.h> #include <malloc.h> #include <stdlib.h>typedef struct Node{int data;struct Node * pNext; }NODE,*PNODE;typedef struct Stack{PNODE pTop; //栈顶元素PNODE pBottom; //栈底部元素 }STACK,*PSTACK;void init(PSTACK); v…

noi 2009 二叉查找树 动态规划

思路&#xff1a; 先把权值离散化 按数据值排序 sum[i]为前i个节点频度和 dp[i][j][w]表示把节点[i,j]合并成一颗根节点权值不小于w的子树所需的访问代价与修改代价的最小和 dp[i][j][w]min(dp[i][k-1][w]dp[k1][j][w]sum[j]-sum[i-1]K,dp[i][k-1][a[k].weight]dp[k1][j][a[k].…

出栈程序演示

#include <stdio.h> #include <malloc.h> #include <stdlib.h>typedef struct Node{int data;struct Node * pNext; }NODE,*PNODE;typedef struct Stack{PNODE pTop; //栈顶元素PNODE pBottom; //栈底部元素 }STACK,*PSTACK;void init(PSTACK); v…

栈清空程序演示

#include <stdio.h> #include <malloc.h> #include <stdlib.h>typedef struct Node{int data;struct Node * pNext; }NODE,*PNODE;typedef struct Stack{PNODE pTop; //栈顶元素PNODE pBottom; //栈底部元素 }STACK,*PSTACK;void init(PSTACK); v…

MySQL学习笔记——显示数据库信息

show privileges 显示可用的系统权限清单。   View Code mysql> show privileges;-----------------------------------------------------------------------------------------------------------------------| Privilege | Context …

队列入门简介

线性结构的两种常见应用之二队列 定义:种可以实现“先进先出”的存储结构 分类:链式队列(链表实现)、静态队列(数组实现) 队列&#xff08;常用数据结构之一&#xff09; 队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端&#xff08;front&#xff09;进行…

静态队列

静态队列- --用数组实现 静态队列通常都必须是循环队列 循环队列的讲解: 1.静态队列为什么必须是循环队列&#xff1f; 数组表示的问题  对于队列最好的方法是使用链表实现&#xff0c;因为对于数组来说&#xff0c;队列可能会出现下面这种情况&#xff1a; 如图所示&#…

链表队列入门介绍

1&#xff0c;快速开始&#xff1a; 队列是一种和栈相反的&#xff0c;遵循先进先出原则的线性表。此文章使用链表来实现队列。 如上图所示&#xff0c;就像一个自来水管&#xff0c;先进入水管的水先从水龙头出来&#xff0c;即Front位置的元素最先出队列&#xff0c;因为它们…

链表队列初始化

队列初始化 初始化主要是对为队列中的两个重要节点分配空间&#xff0c;这里我们需要注意的是初始化时头指针和尾指针指向同一个节点。 代码如下&#xff1a; status initQueue(LinkQueue* que) { //初始化队列que->headque->rear(QueuePtr)malloc(sizeof(QNode));if(…

链表队列入队算法

循环队列入队伪算法讲解 两步完成: 1.将值存入r所代表的位置 2.错误的写法rr1; 正确的写法是:r(r1)%数组的长度 入队操作 一定要搞清指针的概念。 首先rear和head指向同一个元素。然后&#xff0c;我们使rear的next指向新元素&#xff0c;这样rear指向的元素&#xff08;即1&am…

链表队列出队算法

出队操作 我们来思考这个过程&#xff0c;在下图队列中&#xff0c;我们出队的第一个元素是元素A&#xff0c;不是1。&#xff08;因为1不是插入进来了的&#xff0c;而是我们初始化时就有的&#xff09;。我们首先让*t等于head的next&#xff0c;即元素A。然后修改head的next指…

数据库优化 - MYSQL优化

判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断&#xff1a; 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长 应用的日志出现超时等错误 可以使用sar命令&#xff0c;top命令查看当前系统状态。 也可以通过Prometheus、Grafana等监控工具观察系统状态。&a…

队列入队和出队程序演示

#include <stdio.h> #include <string.h> #include <malloc.h>typedef struct Queue {int * pBase;int front;int rear;} QUEUE;void init(QUEUE *); bool en_queue(QUEUE *pQ, int val); //入队 void traverse_queue(QUEUE * pQ); bool full_queue(QUEUE…

图的遍历DFS与BFS(邻接表)

#include "stdafx.h" #include <iostream> #include <fstream> #include <queue> #include <Windows.h>using namespace std;#define INFINITY INT_MAX #define MAX_VERTEX_NUM 20 //顶点最多个数 #define LENGTH 5 //顶点字符长…

递归求n的阶层算法实现

专题:递归 定义:一个函数自己直接或间接调用自己 递归满足三个条件 1、递归必须得有-一个明确的中止条件 2、该函数所处理的数据规模必须在递减 3、这个转化必须是可解的 #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib…

递归求1到100的和算法演示

循环和递归 递归:易于理解、速度慢、存储空间大 循环&#xff1a;不易理解、速度快、存储空间小 #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h>long sum_sum(int n) {if (1 n) {return 1;}else {int sum n sum…

递归实现汉诺塔程序

[将汉诺塔]这不是线性递归&#xff0c;这是个非线性递归! n1 1 n2 3 n3 7 ................. n64 2的64次方减1 [这是个天文数字&#xff0c;就算世界上最快的计算机也解决不了 汉诺塔的复杂度是2的n次方减一 问题很复杂&#xff0c;恒真正解决问题的编码就…

解决scanf_s函数报错:没有为格式字符串传递足够的参数

报错&#xff1a;scanf_s函数报错:没有为格式字符串传递足够的参数 int main() {char s1[20] "i m name";char *p1, *p2;char s3[10] {0};p1 s1;p2 s3;printf("请输入你的名字: \n");scanf_s("%s",&s3);printf("%s\n", s3);f…