#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. Vue详细介绍模板语法和过滤器的使用!

    表达式 {{ XXX }}使用过滤器 {{ XXX | yyy}}使用多个过滤器 {{ XXX | yyy | yyy1}}过滤器带参数 {{ XXX | yyy(123,"zhuiszhu ...

  2. delphi 接口

    第四章          接口 前不久,有位搞软件的朋友给我出了个谜语.谜面是“相亲”,让我猜一软件术语.我大约想了一分钟,猜 出谜底是“面向对象”.我觉得挺有趣,灵机一动想了一个谜语回敬他.谜面是“ ...

  3. 小程序自定义tabbar custom-tab-bar 6s出不来解决方案,cover-view不兼容

    1.从微信小程序的官网扣下来的demo,实际测试中,发现6s ios10 系统不兼容,里面的内容出不来 <cover-view class="tab-bar"> < ...

  4. [转] QML PinchArea

    本文转自安老师的博文:Qt Quick 事件处理之捏拉缩放与旋转 绪论 本文介绍在Android 等智能手机上的一个非常重要的手势:捏拉手势. 捏拉手势最早在苹果手机上得到应用,苹果还曾经尝试为此操作 ...

  5. linux防火墙和SELinux

    1. 关闭防火墙 永久性生效 开启:chkconfig iptables on 关闭:chkconfig iptables off 即时生效 开启:service iptables start 关闭: ...

  6. sklearn---评价指标

    查看sklearn支持的评价指标: import sklearn sorted(sklearn.metrics.SCORERS.keys()) ['accuracy', 'adjusted_mutua ...

  7. LCD编程_LCD控制器

    CLKVAL : VCLK = HCLK / [(CLKVAL+1) x 2]--------> CLKVAL = HCLK/VCLK/2-1 在这个地方HCLK=100M,那么VLCK等于多少 ...

  8. Linux应急响应

    1.识别现象 top / ps -aux 监控与目标IP通信的进程 while true; do netstat -antp | grep [ip]; done 若恶意IP变化,恶意域名不变,使用ho ...

  9. pycharm调试添加命令行参数

    UI界面: Run->Edit Configurations->Parames

  10. MyBatis源码 核心配置解析 properties元素

    XMLConfigBuilder的parseConfiguration(XNode)方法,用于解析配置文件 XMLConfigBuilder的propertiesElement(XNode)方法,用于 ...