#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++)的更多相关文章

  1. js数据结构与算法--单链表的实现与应用思考

    链表是动态的数据结构,它的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 现实中,有一些链表的例子. 第一个就是寻宝的游戏.你有一条线索,这条线索是指向寻找下一条线 ...

  2. 数据结构之 线性表---单链表操作A (删除链表中的指定元素)

    数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据 ...

  3. 单链表操作B 分类: 链表 2015-06-07 12:42 15人阅读 评论(0) 收藏

    数据结构上机测试2-2:单链表操作B TimeLimit: 1000ms Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除 ...

  4. c语言实现--带头结点单链表操作

    可能是顺序表研究的细致了一点,单链表操作一下子就实现了.这里先实现带头结点的单链表操作. 大概有以下知识点. 1;结点:结点就是单链表中研究的数据元素,结点中存储数据的部分称为数据域,存储直接后继地址 ...

  5. python基础下的数据结构与算法之链表

    一.链表的定义 用链接关系显式表示元素之间顺序关系的线性表称为链接表或链表. 二.单链表的python实现 class Node(object): """定义节点&quo ...

  6. 数据结构&算法-单链表

    1.引言 工作一年了,感觉越来越懒散,把很多基础性的东西都慢慢遗忘了,最近想趁着还没忘完,回顾一下,整理了点笔记,分享一下. 如有错的地方,欢迎大家怒喷. 2.学习 我们就从最简单的链表开始吧. 链表 ...

  7. 数据结构:DHUOJ 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果)

    单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 时间限制: 1S类别: DS:线性表->线性表应用 题目描述: 输入范例: -5345646757684654765867 ...

  8. Java数据结构和算法之链表

    三.链表 链结点 在链表中,每个数据项都被包含在‘点“中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中 ...

  9. Java数据结构和算法(四)--链表

    日常开发中,数组和集合使用的很多,而数组的无序插入和删除效率都是偏低的,这点在学习ArrayList源码的时候就知道了,因为需要把要 插入索引后面的所以元素全部后移一位. 而本文会详细讲解链表,可以解 ...

随机推荐

  1. 左右对齐Justify遇到的坑

    遇到的问题 这两天在开发一个病历的对外展示页面,设计稿上label是左右拉伸对齐的,显示效果如下: 怎么实现这种效果呢? 首先想到的是文字中间加空格,但是这种方式太low了,而且不太容易控制.网上查资 ...

  2. django 开发Broken pipe from ('127.0.0.1', 58078)问题解决

    最近写的一个项目,前端使用了表单submit提交,后端接收POST数据存储.实际上的逻辑并不复杂, django接收到的时候会产生Broken pipe from ('127.0.0.1', 5807 ...

  3. 实验吧——因缺思汀的绕过(sql with rollup)

    题目地址:http://ctf5.shiyanbar.com/web/pcat/index.php 通读源码,得知出flag的条件 1.需要post提交uname以及pwd,否则直接die了 if ( ...

  4. weblogic漏洞

    1 weblogic控制台地址暴露 ²  整改方法: 禁用weblogic控制台.在weblogic域(sguap-domain和base-domain)的config下的config.xml中 &l ...

  5. kubernetes学习之二进制部署1.16

    服务器规划和系统初始化 一.服务器规划 10.255.20.205 Master01 kube-apiserver.kube-controller-manager.kube-scheduler.ETC ...

  6. nginx实现反向代理 配置多域名以及多端口号

    多个服务部署在同一个服务器,使用不同的端口. 一.思考过程 如果不想带上端口号,就只能访问 80 或 443 端口. 可以用过二级目录区分服务,通过反向代理转发到不同的 Server. 可以用过子域名 ...

  7. A站(ACFun)爬虫爬取并播放、下载视频(JAVA)

    本文使用的工具有vlc+ffmpeg+phantomjs 一般视频网站的视频地址暴露的方式有两种: 1.html直接暴露 2.通过ajax异步返回. A站使用的方式是第二种.针对第一种方式,直接使用j ...

  8. 1. 观察者模式总结(C++)

    1. 介绍 观察者模式:定义了一种"一对多"的依赖关系,让多个观察者对象同时监听一个对象的改变,即当该对象的状态发现改变时,会通知所有它依赖的观察者对象.观察者模式属于行为模式. ...

  9. 【java异常】It's likely that neither a Result Type nor a Result Map was specified

    错误原因:mybatis配置文件没有返回类型参数 resultType 解决办法:resultType= 添加

  10. q1096

    一,看题 1,大概是每个点都来一次BFS标记下应该就可以. 2,你可以想想队列为啥pop()是l++; 3,还是字符你得注意下. 4,x,y,m,n,行列你得搞清楚. 5,这棋盘的破东西.. 6,额, ...