-
(C语言)写一个函数del,用来删除动态链表中指定的节点
2019-05-10 22:50:26写一个函数del,用来删除动态链表中指定的节点写一个函数del,用来删除动态链表中指定的节点
用creat,print,del,insert四个函数,编写主函数,先后调用这些函数,实现链表的建立,输出,删除和插入,从主函数中指定需要删除和插入的节点的数据 https://blog.csdn.net/qq_41071068/article/details/90117026
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct arr { int num; struct arr* next; }; typedef struct arr arr; arr* creat(int n) { arr* s; arr* p; arr* head = (arr*)malloc(sizeof(arr));//头结点 p = head; for (int i = 0; i < n; ++i) { s = (arr*)malloc(sizeof(arr)); s->num = i + 1; s->next = p->next; p->next = s; p = p->next; if (i == n - 1) { p->next = NULL; } } return head; } void print(arr* head) { for (arr* p = head->next; p != NULL; p = p->next) { printf("%d\t", p->num); } printf("\n"); } arr* del(arr* head, int m) { arr* p = head; arr* temp; for (int i = 0; i < m - 1; ++i) { p = p->next; } temp = p->next; p->next = temp->next; free(temp); return head; } void main() { int n ,m; printf("请输入链表的长度\n"); scanf("%d", &n); arr* head; head = creat(n); printf("输出未删除指定节点前链表\n"); print(head); printf("要删除第几个节点,请输入\n"); scanf("%d", &m); for (; m < 1 || m>n; printf("您的输入有误,请重新输入\n"), scanf("%d", &m)); head = del(head, m); printf("删除指定结点后链表为\n"); print(head); system("pause"); }
-
04 链表的删除:删除链表中指定位置的元素(Linked List 链表)
2019-06-26 18:44:45采用C语言实现:完整删除链表中指定位置的元素的代码。 原链表:3->4->5。现在要删除位置为2处的元素。 删除后的链表:3->5。 #include <stdio.h> #include <stdlib.h> #include <MacTypes...采用C语言实现:完整删除链表中指定位置的元素的代码。
原链表:3->4->5。现在要删除位置为2处的元素。
删除后的链表:3->5。#include <stdio.h> #include <stdlib.h> #include <MacTypes.h> /*定义节点*/ typedef struct Node { int data; struct Node *next; } LinkedList; /*使用头插法来构建一个链表*/ void push(struct Node **head_ref, int new_data); /*给一个指针的指针作为引用,作为这个链表的头指针,进行删除指定位置的节点*/ void deleteNode(struct Node **head_ref, int position); /*打印链表*/ void printList(LinkedList *node); int main() { LinkedList *head_ref = NULL; //注意这里要传取地址符 push(&head_ref, 3); push(&head_ref, 4); push(&head_ref, 5); deleteNode(&head_ref,2); printList(head_ref); return 0; } /* * 头插法的几步 * 1.定义一个新的指针,给指针申请空间,使其变成一个新的节点。 * 2.给这个新的节点data数据域赋值。 * 3.将这个新的节点的next指针指向原来的开始节点(原头指针指向的节点) * 4.将原头指针左移移动到新的节点 */ void push(struct Node **head_ref, int new_data) { LinkedList *new_node = (LinkedList *) malloc(sizeof(LinkedList)); new_node->data = new_data; new_node->next = (*head_ref); (*head_ref) = new_node; } /*从给定节点往后打印链表*/ void printList(LinkedList *node) { //节点不为空,循环 while (node != NULL) { //打印节点值 printf(" %d \n", node->data); //指针后移 node = node->next; } } /*删除指定位置的的节点*/ void deleteNode(struct Node **head_ref, int position) { //1.首先判断这个链表是否为空 if (*head_ref == NULL) { return; } //2.创建一个指针存储头节点 struct Node *temp = *head_ref; //3.如果这个position是0,那么直接移除掉头节点 if (position == 0) { *head_ref = temp->next; free(temp); return; } //4.从头节点遍历,找到删除位置position的前驱节点,temp指向前驱 for (int i = 0; temp != NULL && i < position - 1; ++i) { temp = temp->next; } //5.如果这个位置比链表还长 if (temp == NULL || temp ->next == NULL){ return; } //6.创建一个新的指针指向将要删除的节点的下一个节点 //temp是删除节点的前驱 //temp->next 这个节点是即将被删除的节点 struct Node *next = temp->next->next; //7.删除节点 free(temp->next); //8.将next节点连接在前驱节点temp后面 temp->next=next; }
输出:
5 4
-
【c】在c语言中遍历有头单向链表,和删除一个有头单向链表当中的指定元素,翻转链表,详解。
2019-06-24 10:56:30首先讲思路,在单向链表当中,我们可以用遍历的方法找到指定元素的节点指针和上一个指向它的指针,首先我们来讲链表的遍历。 typedef int SLTDataType; typedef struct SListNode { SLTDataType _data; struct ...首先讲思路,在单向链表当中,我们可以用遍历的方法找到指定元素的节点指针和上一个指向它的指针,首先我们来讲链表的遍历。
typedef int SLTDataType; typedef struct SListNode { SLTDataType _data; struct SListNode* _next; }SListNode;//链表节点,这是链表当中的单个块,包含了一个要存储的变量,和一个指针,当给_data //赋值的时候需要动态开辟个内存,因此链表使用的是堆空间 typedef struct SList { SListNode* _head; }SList; void SListPrint(SList* plist) { assert(plist); SListNode* cur; for (cur=plist->_head;cur;cur=cur->_next) { printf("%d->", cur->_data); } printf("NULL\n"); }
可以看到,用一个for循环就可以。定义一个链表节点类型的指针将头结点给它,作为循环的初值,判断条件是当前指针是否指向空,累加条件是将定义到的cur指针的指向不断后移。读者可以画图自行演示。
接下来我们来看删除指定元素。
首先要找到指定的元素,可以用链表的遍历找到,找到之后要将其删除,我们就需要知道前一个指向它的指针,怎么办呢,我们同样可以用一个for循环来实现。
int SListPopFrontJudge(SList* plist, SLTDataType x) { if (plist->_head->_data == x) { SListNode *tmp; if (plist->_head) { tmp = plist->_head; plist->_head = plist->_head->_next; free(tmp);//释放掉第一个cur return 1; } } else return 0; } void SListRemove(SList* plist, SLTDataType x) { //删除x int receive = 0; receive=SListPopFrontJudge(plist, x); if (!receive) { SListNode* tmp = NULL; SListNode* before = plist->_head; SListNode* cur; cur = plist->_head->_next; for (; cur; cur = cur->_next, before = before->_next) //链表遍历 { if (cur->_data == x) { break; } } tmp = cur; before->_next = tmp->_next; free(tmp); } }
我们用两个结构体节点指针来完成链表遍历。
这样不但能知道当前指针还能知道它的前一个指针,通过改变前一个指针的指向就可以删除这个元素,在这里要强调的是,链表的首元素在遍历过程中不会被遍历到,这就需要我们单独判断要删除的是不是首元素,也很简单,看上面代码就能看懂。
接下来看链表的翻转:
void SListreverse(SList* plist) { static SList reve; SListInit(&reve); SListNode* cur; for (cur = plist->_head; cur; cur = cur->_next) { SListPushFront(&reve, cur->_data); } SListPrint(&reve); }
核心思想是,将要翻转的链表遍历一遍,将遍历到的元素重新压栈,就可以实现链表翻转,因为栈有先进后出原则。
以上讲解代码不完整想要看完整代码可以访问,
-
C语言—删除文件中的指定内容
2018-04-27 20:30:06C语言—删除文件中的指定内容 学生信息管理系统临近尾声,在管理员端口可以对教师的信息进行管理,今天突然想起来只能添加教师信息但不能删除教师信息,对于学生信息的删除,一直都是先将文件内的数据读入链表中,...C语言—删除文件中的指定内容
学生信息管理系统临近尾声,在管理员端口可以对教师的信息进行管理,今天突然想起来只能添加教师信息但不能删除教师信息,对于学生信息的删除,一直都是先将文件内的数据读入链表中,在链表中删除节点,再重新写进文件里。但因为教师信息比较少,并且只有用户名和密码,所以我并没有用链表来存放教师的信息,所以要删除教师信息只能直接使用文件的操作,以上是背景
- 先介绍一下这个删除操作的中心思想:创建一个临时文件,用数组录入你要删除的教师的信息,,然后在原文件中查找,遇到与要删除内容不同的数据,将这些数据写入临时文件中,当遇到要删除的内容时,利用文件的随机读写跳过这些数据,继续将后面的数据录入到临时文件中,最后删除原文件,并将临时文件的名字改为原文件的名字,这样就实现了对指定内容的删除。
用到的函数:
- 文件的打开与关闭fopen(),fclose();
- 文件的模块读写:fread(),fwrite();
- strcmp() 比较两字符串,判断是否相同;
- 文件的随机读写操作:rewind()和fseek(),功能分别是将文件指针指向文件开头和移动文件指针到指定位置;
- 删除文件操作remove();
- 重命名文件操作:rename();
一下是函数的模块(不想重写了,直接上项目里的模块):
void delete_tea(){ // 删除教师信息(直接在文件内部操作) FILE *fp,*ft; char set[20]; int index=0; printf("请输入要删除的教师用户名:"); scanf("%s",set); char key[20]; fp=fopen("d:\\t_key.txt","rt+"); ft=fopen("d:\\temp.txt","wt"); if(fp==NULL || ft==NULL){ printf("错误!\n"); return; } while(fread(key,sizeof(key),1,fp)){ if(strcmp(key,set)!=0){ fwrite(key,sizeof(key),1,ft); index++; } else{ rewind(fp); fseek(fp,sizeof(key)*(index+2),0); } } fclose(fp); fclose(ft); remove("d:\\t_key.txt"); rename("d:\\temp.txt","d:\\t_key.txt"); printf("教师信息删除成功!\n"); }
-
C语言中双链表的创建 添加 删除和修改
2019-05-13 21:31:31最近学习C语言的链表操作,看了很多例子,学习完成后我自己总结了一下,并写了比较完整的代码。下面是我写的代码,代码的量可能有点大,请谅解。...包括两种情况,分为删除指定的位置节点和删除指定数据所在的节点... -
C语言完成 链表的建立、查询、删除操作
2019-05-25 16:12:26C语言完成链表的建立、查询、插入和删除操作,...实现按学号删除链表中的指定节点的功能 2.将1中的链表拆分成两个链表b和c,b中存放80分以上成绩的节点,c中存放其他节点 3.将1中的链表改为按计算机成绩递增顺序... -
C语言数据结构-2-单项链表-递归实现无头单向链表的指定值全部删除
2021-01-12 15:46:40为什么用地址传递的参数就可以不断链???? C语言中只能用地址传递,不能用引用传递“&" #include <stdio.h> #include <...//建立包含头节点的单向链表,动态建立! //操作的思路;全是保 -
(C语言)用creat,print,del,insert四个函数,编写主函数,先后调用这些函数,实现链表的建立,输出,删除和插入,...
2019-05-11 23:59:55用creat,print,del,insert四个函数,编写主函数,先后调用这些函数,实现链表的建立,输出,删除和插入,从主函数中指定需要删除和插入的节点的数据 -
C语言链表简单操作
2021-02-01 22:35:47文章目录C语言链表简单操作创建链表 初始化链表头插法尾插法任意位置插法删除链表中的指定数字返回链表中第i个结点(地址)根据数值查找返回节点的位置删除链表中第i个结点,并且用x带出删除的值链表中查找是否结点... -
pb中的tounicode 函数_C语言中链表的应用及相关代码(2)
2020-12-06 13:45:03一、删除链表中指定的节点1:先寻找删除点代码体现:STU* detele_link(STU *head,char *name) { //1、判断链表是否存在 if(head == NULL)//不存在 { printf("link not foundn"); return head; } else//存在... -
C语言之双链表的基本操作
2021-02-28 04:47:01本文主要介绍一下用c语言如何实现双向链表的一些基本操作,主要涉及到双向链表的创建、在指定位置插入一个数据节点、在指定位置删除一个数据节点、在链表中查找某一特定元素、以及遍历整个双向链表,最后也有... -
C语言学习--链表
2019-05-19 17:06:06C语言 链表习题 !.建立单链表,每个节点包括学号、姓名、性别、年龄和计算机成绩。实现按学号删除 链表中指定结点的功能。 2. 将 1 中建立的单向链表 a 分别拆...4. 输入新的结点,插入到 3 中的递增顺序的链表中。... -
怎么将文件中的信息写入链表_图解环形链表——创建、循环赋值与删除
2020-11-29 04:59:28C语言中,链表是一种数据结构,相比较数组的连续存储,链表是一种将内存分散(当前也可以连续)的数据节点通过指针的方式连接在一起,此外,链表不仅可以存储简单的数据类型,还可以存储结构体,只要定义好自己的... -
C/C++编程笔记:C语言详解“双向循环链表“的基本操作(下)
2020-12-23 21:16:00更改双链表中指定结点数据域的操作是在查找的基础上完成的。 实现过程是:通过遍历找到存储有该数据元素的结点,直接更改其数据域即可。 6.双向链表的查找 通常,双向链表同单链表一样,都仅有一个头指针。 ... -
关于C语言链表的一些问题,代码怎么都运行不成功跪求大神指点
2015-05-03 13:19:57}/*如果pb指向的年龄比pa的小,则插入到La链表中*/ } while(pa!=NULL){ s=pa->next; pa->next=La->next; La->next=pa; pa=s;}/*处理La未处理的数据*/ while(pb!=NULL){ s=pb->next; pb->next=La->... -
图解环形链表——创建、循环赋值与删除
2020-11-15 22:34:16C语言中,链表是一种数据结构,相比较数组的连续存储,链表是一种将内存分散(当前也可以连续)的数据节点通过指针的方式连接在一起,此外,链表不仅可以存储简单的数据类型,还可以存储结构体,只要定义好自己的... -
你必须知道的495个C语言问题
2015-10-16 14:14:281.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 存储类型 1.10 同一个静态(static)函数或变量的所有声明都必需包含static存储类型吗? 1.11 extern在函数声明中是什么意思? ... -
C语言编程练习之单链表基本操作
2010-08-03 01:28:251.打印链表(PrintList) ...4.链表中删除指定节点(DeleteNode) 5.找链表中第一个出现的最小节点(FindMin) #include "stdio.h" typedef struct node { int data; struct node* ... -
《你必须知道的495个C语言问题》
2010-03-20 16:41:181.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 5 存储类型 6 1.10 同一个静态(static)函数或变量的所有声明都必须包含static存储类型吗? 6 1.11 extern在函数声明中是什么... -
你必须知道的495个C语言问题(高清版)
2010-03-31 16:24:091.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 5 存储类型 6 1.10 同一个静态(static)函数或变量的所有声明都必须包含static存储类型吗? 6 1.11 extern在函数声明中是什么... -
c语言经典案例
2014-10-30 08:06:57实例111 删除字符串中的连续字符 146 实例112 统计各种字符个数 147 实例113 字符串替换 148 实例114 回文字符串 150 实例115 字符串加密和解密 151 实例116 对调最大数与最小数位置 153 第10章 函数编程基础 155 ... -
链表 — 试题笔记
2016-11-01 21:52:01在C语言中,静态链表的表现形式即为结构体数组,结构体变量包括数据域data和游标CUR。例: 若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间:A 顺序表 B 双... -
C语言学生通讯录管理系统
2009-04-09 23:09:52设计一个《学生通讯录管理系统》,在动态链表程序的基础上,设计要求如下 (必须使用结构体和链表等数据结构) 1建立文件 存储文件使用指定文件名或默认文件名; 可以不保存输入记录,但需要确认是否保存输入记录... -
C语言之简易学生信息管理程序
2019-01-31 15:47:49删除(删除指定信息的学生信息); 显示(显示链已有的信息); 将信息存放至文件; 将文件的学生信息读出至链中; 此次用的是带头节点的链表: 结构体中存放的有{学号,名字,曾用名,身份证,成绩} #... -
C语言通用范例开发金典.part2.rar
2012-08-31 14:18:18范例1-49 删除双向链表中的节点 121 ∷相关函数:ListDelete函数 1.3.19 双向链表的元素个数 124 范例1-50 双向链表的元素个数 124 ∷相关函数:ListLength函数 1.3.20 判断双向链表是否为空 126 范例1-51 ... -
单链表的实现 进阶版
2018-04-08 02:42:40以下为单链表(不带头节点,不带环)的C语言实现代码 注:建议结合单链表(基础版)一起来看,因为进击版中的一些功能的实现调用了基础版的一些函数(已标出)可以简化功能实现的代码量。//在pos前插入元素,不遍历... -
JAVA面试题最全集
2010-03-13 13:09:1037.classloader中,JDK的API、Classpath中的同web-inf中的class加载方式有什么区别? 38.列举三种以上垃圾回收算法,并比较其优缺点? 39.编写代码实现一个线程池 40.描述一下JVM加载class文件的原理机制? 41....
收藏数
32
精华内容
12
-
MySQL 数据库的基本操作(数据完整性约束)
-
浅析JAVA、WEB、PHP、UI、Python、C、C++特点与关系
-
MySQL 事务和锁
-
Modbus串口数据监控&绘制曲线DotTrend_Setup.rar
-
MySQL 主从复制 Replication 详解(Linux 和 W
-
计算机基础2:正向代理和反向代理的区别是什么?
-
LS1043ADPAARM.pdf
-
官方授权正版 Surfer 中文网站 专业 2D/3D 地理绘图软件
-
微服务化之无状态化与容器化(转载)
-
xxljob源码分析
-
jdk1.8安装教程.doc
-
实验2-2-4 计算分段函数[2] (10 分)
-
MySQL 四类管理日志(详解及高阶配置)
-
西门子PLC例程777个.zip
-
同步异步,阻塞非阻塞区别
-
使用vue搭建微信H5公众号项目
-
蚂蚁菌落针对不同细胞群体密度分布的自动跟踪方法
-
助贷业务创新与监管研究报告.pdf
-
MySQL NDB Cluster 负载均衡和高可用集群
-
MMM 集群部署实现 MySQL 高可用和读写分离