【数据结构与算法】单链表操作(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源码的时候就知道了,因为需要把要 插入索引后面的所以元素全部后移一位. 而本文会详细讲解链表,可以解 ...
随机推荐
- 使用gacutil把COM组件注册到全局缓存GAC中
我们在编写软件的时候,有时候需要调用COM组件,那就需要注册了,注册有两种,一种是使用regasm 在程序运行的时候注册,参考“pb调用C#编写的DLL类库“,不过受路径的限制.还有一种注册方式,使用 ...
- centos7安装mysql注意点
yum安装yum -y install mariadb-server 启动服务systemctl start mariadb.service 开机自动启动systemctl enable mariad ...
- mysql官网下载对应的mysql包
1. 在百度搜索mysql,点击mysql官网上下载mysql的地址 在url直接输入mysql的下载地址也可以:https://dev.mysql.com/downloads/mysql/ 如图: ...
- ubuntu16.04 共享文件夹之后 /mnt/hgfs目录下没有显示共享的文件夹
root权限执行: apt-get install open-vm-tools vmhgfs-fuse .host:/ /mnt/hgfs
- ARM开发板上查看动态库或者可执行程序的依赖关系
以ARM32开发板为例,在/lib下有一个名为ld-linux-armhf.so.3的可执行程序(在ARM64开发板上是/lib/ld-linux-aarch64.so.1),这个程序负责加载可执行程 ...
- bert模型参数简化
我们下载下来的预训练的bert模型的大小大概是400M左右,但是我们自己预训练的bert模型,或者是我们在开源的bert模型上fine-tuning之后的模型的大小大约是1.1G,我们来看看到底是什么 ...
- AQS 抽象队列同步器(Abstract Queued Synchronizer) 知识点
AQS的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态. AQS使用一个int类型的成员变量state来表示同步状态,当state>0时表示已经获取了锁,当state = ...
- MongoDB在windows及linux环境下安装
linux下安装配置 整理中... windows下安装配置 1.下载: https://www.mongodb.com/download-center?jmp=nav 2.解压到D盘 3.D:\下创 ...
- bloginfo()用法小结|wordpress函数
bloginfo()显示关于您的wordpress站点的信息,主要是从您的用户配置文件和WordPress管理屏幕的一般设置中收集的信息.它可以在模板文件的任何地方使用.这总是将结果打印到浏览器.如果 ...
- 15-C#笔记-结构体
示例: using System; using System.Text; struct Books { private string title; // 支持 public private strin ...