【数据结构与算法】单链表操作(C++)
#include <stdio.h>
#include <malloc.h>
/*单链表节点定义*/
typedef struct LNode {
int data; //data中存放节点数据域
struct LNode *next; //指向后继节点的指针
}LNode; //定义单链表节点类型 /*例2.3开始*/
/*A和B是两个单链表(带表头结点),其中元素递增有序,设计一个算法,将A 和B归并成一个按元素值非递减有序的链表C,C由A和B中的节点组成*/
void mergeLNodeAsc(LNode *A, LNode *B, LNode *&C) {
LNode *p = A->next;//p用来跟踪A的最小值节点 A->next表示A链表的开始节点(头结点的下一个) A递增,所以p指向他表示指向A的最小节点,即用p来跟踪A的最小节点
LNode *q = B->next;//q来跟踪B的最小值节点
LNode *r; //r始终指向C的终端节点
C = A;//用A的头结点来做C的头结点
C->next = NULL;
free(B); //B的头结点无用,则释放掉
r = C;//r指向C 因为此时头结点也是终端节点
while (p!=NULL&&q!=NULL) {//当p和q都不空时,选取p和q所指节点中的较小者插入C的尾部
if (p->data<=q->data) {
printf("p小于q");
r->next=p; //赋值C的节点
p = p->next; //p前移一个
r = r->next; //r前移一个 }
else {
printf("q小于p");
r->next = q;
q = q->next;
r = r->next;
} }
r->next = NULL; //这一个其实可以去掉 因为至少会剩下一个插入到C的尾部
/*将还有剩余节点的链表插入到C的尾部*/
if (p!=NULL) {
r->next = p;
}
if (q != NULL) {
r->next = q;
} }
/*例2.3结束*/ /*尾插法建立链表C*/ void createListR(LNode *&C,int a[],int n) {//要改变的变量用引用型
LNode *s, *r;//s用来指向新申请的节点,r始终指向C的终端节点
int i;
C = (LNode *)malloc(sizeof(LNode));//申请C的头结点空间
C->next = NULL;
r = C;//r指向头结点,因为此时头结点就是终端节点
for (i = ; i < n;++i) {
s = (LNode *)malloc(sizeof(LNode)); //s指向新申请的节点
s->data = a[i]; //用新申请的节点来接收a的一个元素
r->next = s; //用r来接纳新节点
r = r->next; //用r指向终端节点,以便于接纳下一个到来的节点
}
r->next = NULL;//数组a中所有的元素都已经装入链表C中,C的终端节点的指针域为NULL C建立完成 } /*头插法建立链表C*/
void createListF(LNode *&C, int a[], int n) {//要改变的变量用引用型
LNode *s;//s用来指向新申请的节点
int i;
C = (LNode *)malloc(sizeof(LNode));//申请C的头结点空间
C->next = NULL;
for (i = ; i < n; ++i) {
s = (LNode *)malloc(sizeof(LNode)); //s指向新申请的节点
s->data = a[i]; //用新申请的节点来接收a的一个元素
s->next = C->next;//s所指新节点的指针域next指向C的开始节点
C->next = s;//头结点的指针域next指向s节点,使得s称为新的开始节点
} } /*归并为递减的单链表*/ void mergeLNodeDesc(LNode *A,LNode *B,LNode *&C) { LNode *p = A->next;
LNode *q = B->next;
LNode *s;
C = A;
C->next = NULL;
free(B);
while (p!=NULL&&q!=NULL) {
if (p->data<=q->data) {
s = p;
p=p->next;
s->next=C->next;
C->next = s;
}
else {
s = q;
q = q->next;
s->next = C->next;
C->next = s;
}
}
/*必须将剩余元素逐个插入C的头部才能得到最终的递减序列*/ while (p!=NULL) {
s = p;
p = p -> next;
s ->next = C->next;
C->next = s;
}
while (q != NULL) {
s = q;
q = q->next;
s->next = C->next;
C->next = s;
} } /*例2.4开始*/
/*查找链表C中是否存在一个值为x的节点,若存在,则删除该节点并返回1,否则返回0*/ int findAndDelete(LNode *C,int x) {
LNode *p, *q; /*q用来接纳删除的元素 ,p用来指向C的节点*/
p = C;
while (p->next!=NULL) { if (p->next->data ==x) {/*查找的是要删除节点的额前驱节点*/
break;
}
p = p->next; /*如果当前不是要找的节点 则p向后移*/
}
/*没找到*/
if (p->next ==NULL) {
return ; }
else {
/*删除部分开始*/
q = p->next;
p->next = p->next->next;
free(q);
/*删除部分结束*/
return ;
} }
/*例2.4结束*/ /*打印链表中的元素*/
void showLNode(LNode *C) {
LNode *p;
p = C;
while (p->next!=NULL) {
printf("C的数据为:%d\n", p->next->data);
p = p->next;
} } void main() { LNode *C;
int a[] = { ,,, };
int n = ;
createListF(C, a, n);
showLNode(C);// 4 3 2 1
findAndDelete(C, );
showLNode(C);// 4 3 1 LNode *D;
int b[] = { ,,,,, };
int m = ;
createListR(D, b, m);
showLNode(D); // 1 2 3 4 5 6 findAndDelete(D, );
showLNode(D);// 1 2 3 4 5 6
printf("开始合并数组"); LNode *M;
int m1[] = { ,, };
int m2 = ;
createListR(M, m1, m2);
LNode *N;
int n1[] = { ,, };
int n2 = ;
createListR(N, n1, n2);
LNode *O;
mergeLNodeDesc(M, N,O);
showLNode(O);// 6 5 4 3 2 1 LNode *Q;
int q1[] = { ,, };
int q2 = ;
createListR(Q, q1, q2);
LNode *R;
int r1[] = { ,, };
int r2 = ;
createListR(R, r1, r2);
LNode *P;
mergeLNodeAsc(Q, R, P);
showLNode(P);// 1 2 3 4 5 6
}
【数据结构与算法】单链表操作(C++)的更多相关文章
- js数据结构与算法--单链表的实现与应用思考
链表是动态的数据结构,它的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 现实中,有一些链表的例子. 第一个就是寻宝的游戏.你有一条线索,这条线索是指向寻找下一条线 ...
- 数据结构之 线性表---单链表操作A (删除链表中的指定元素)
数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据 ...
- 单链表操作B 分类: 链表 2015-06-07 12:42 15人阅读 评论(0) 收藏
数据结构上机测试2-2:单链表操作B TimeLimit: 1000ms Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除 ...
- c语言实现--带头结点单链表操作
可能是顺序表研究的细致了一点,单链表操作一下子就实现了.这里先实现带头结点的单链表操作. 大概有以下知识点. 1;结点:结点就是单链表中研究的数据元素,结点中存储数据的部分称为数据域,存储直接后继地址 ...
- python基础下的数据结构与算法之链表
一.链表的定义 用链接关系显式表示元素之间顺序关系的线性表称为链接表或链表. 二.单链表的python实现 class Node(object): """定义节点&quo ...
- 数据结构&算法-单链表
1.引言 工作一年了,感觉越来越懒散,把很多基础性的东西都慢慢遗忘了,最近想趁着还没忘完,回顾一下,整理了点笔记,分享一下. 如有错的地方,欢迎大家怒喷. 2.学习 我们就从最简单的链表开始吧. 链表 ...
- 数据结构:DHUOJ 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果)
单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 时间限制: 1S类别: DS:线性表->线性表应用 题目描述: 输入范例: -5345646757684654765867 ...
- Java数据结构和算法之链表
三.链表 链结点 在链表中,每个数据项都被包含在‘点“中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中 ...
- Java数据结构和算法(四)--链表
日常开发中,数组和集合使用的很多,而数组的无序插入和删除效率都是偏低的,这点在学习ArrayList源码的时候就知道了,因为需要把要 插入索引后面的所以元素全部后移一位. 而本文会详细讲解链表,可以解 ...
随机推荐
- java.util.DualPivotQuickSort的实现
DualPivotQuickSort汇集了多种排序算法,称之为DualPivotQuickSort并不合适.不同的排序算法有不同的使用场景.看懂此文件,排序算法就算彻底搞懂了. 本文只介绍有用的代码片 ...
- Jenkins 任务定时
在项目配置中选择 Build Triggers 下勾选 Build periodically,可以对项目进行定时构建设置.构建设置详细可通过右边的问号符号进行查看. 定时构建字段遵循 cron 的语法 ...
- Bugku 多次
网址:http://123.206.87.240:9004/1ndex.php?id=1 前言:bugku中一涉及多次注入的题 1.异或注入(判断字符是否被过滤) 0X00 很明显 注入点在id上 ...
- 微信小程序开发--flex详细解读
一.结构:flex布局 是由一个大的容器加上多个子元素组成. <view class="container"> <view </view> <v ...
- 本机安装mysql步骤
原文:https://www.cnblogs.com/dukeShi/p/6546024.html 本机安装mysql服务,步骤教程(另附SQLyog和Navicat工具) 因为这段时间不是装系统就是 ...
- flask 简单示例
flask import flask from flask import jsonify from flask import request # 要获取到请求参数的话,就要导入这个模块 ''' 创建接 ...
- window配合虚拟机VMware搭建虚拟ubuntu服务器入坑集锦
1.VMware虚拟机和主机进行网络连接设置 https://jingyan.baidu.com/article/adc81513b86621f723bf7383.html 2.解决linux虚拟机与 ...
- 高并发&高可用系统的常见应对策略
解耦神器:MQ MQ是分布式架构中的解耦神器,应用非常普遍.有些分布式事务也是利用MQ来做的.由于其高吞吐量,在一些业务比较复杂的情况,可以先做基本的数据验证,然后将数据放入MQ,由消费者异步去处理后 ...
- python中os与sys作用与区别
https://www.cnblogs.com/cloak/p/11237285.html OS模块 在自动化测试中,经常需要查找操作文件,比如说查找配置文件(从而读取配置文件的信息),查找测试报告( ...
- JDK8 Steam流操作
原文:https://github.com/niumoo/jdk-feature/blob/master/src/main/java/net/codingme/feature/jdk8/Jdk8Str ...