#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. 了解MySQL

    目前流行的数据库 MySQL Oracle Microsoft SQLServer Microsoft Access PostgreSQL DB2/UDB InfoMax MySQL介绍 世界上最流行 ...

  2. String类常用功能

    String类常用功能 判断: boolean equals(Object obj) boolean equalsIgnoreCase(String str) //忽略大小写 boolean star ...

  3. SVG跟随父级DIV自适应

    后台返回过来的是这样的SVG标签 <svg width="100%" height="100%" version="1.1" xmln ...

  4. 锁、分布式锁、无锁实战全局性ID

    1.为什么要使用锁 当发生并发时,会产生多线程争夺一个资源,为保证资源的唯一性. JVM锁:对象锁,死锁,重入锁,公平锁,偏向锁 分布式锁:数据库 nosql .zookeeper 面试题:如何排查死 ...

  5. Django ORM (二) 增加操作

    数据库表结构生成完毕后,可以使用工具连接上去 在 app01_author 表创建基础记录 在 app01_publisher 表创建基础记录 添加 data_oper 方法 在 urls.py 文件 ...

  6. grep基本详细使用

    过滤文件类容---grep grep正则表达式应用: #grep [option]"pattern" 文件名称 pattern模式 由普通字符和正则表达式的元字符组构成的条件 简单 ...

  7. Linux文件增删改

    Linux目录/文件增删改 创建文件 (1) # touch  <文件名称> (2) 花括号展开 touch /root/{1,3,9}.txt touch /root/{0..100}. ...

  8. TP框架命令行操作

    cmd进入到tp项目根目录 php think route:list #查看以定义路由 php think version #框架版本 php think list #指令列表 php think h ...

  9. 记一次wsl上的pip3安装失败问题 The following packages were automatically installed and are no longer required:

    转载请注明来源.https://www.cnblogs.com/sogeisetsu/.然后我的CSDNhttps://blog.csdn.net/suyues/article/details/103 ...

  10. 使用 python set 去重 速度到底是多快呢???

    这次去测试一下 python 的set去重,速度怎么样? 我们要做的是把文件一次性读取到内存中,然后去重,输出去重的长度. 第一步:对 121w 条数据去重,看去重话费的时间 上证据: 第二步:对 1 ...