结构定义

typedef struct LNode {int data;  // 数据域(可以是其他类型)struct LNode *next;//指针域 (此处代表指向后驱节点)
};

A和B是两个单链表(带头节点),其中元素递增有序,设置一个算法将A和并合并成一个按元素值非递减有序的链表C,C由A和B节点组成

void merge(LNode *A, LNode *B, LNode *&C) {     //也可以尝试下不借助C 写一个将A和B合并到A的LNode *p = A->next; //p来追踪 A的最小值节点LNode *q = B->next; //q来追踪B的最小值节点LNode *r;  //r始终指向C的终端节点(最后一个节点)C = A;     //C用A的地址(如果C未申请地址)C->next = NULL; //将C初始化为一个空链表 , 可有可无,建议写上,防止智障老师。//free(B);  //可有可无  此时把A也释放了也无妨 r = C;   //r指向C的头节点while (p != NULL && q != NULL) {  //p和q都不为空的时候,进行//下面用的尾插法if (p->data <= q->data) {  //如果p指向的值小,那么将p插入到r后面r->next = p; p = p->next;   //p后移,r = r->next;  //r后移,r始终指向最后一个节点}else {r->next = q;q = q->next;r = r->next;}}//r->next = NULL;  // 可有可无if (p != NULL) {  //若p还有剩余节点,则继续插入 注意此处,插入p代表p后面所有节点也随着插入了r->next = p;}if (q != NULL) {  //同上r->next = q;}
}

用尾插法建立链表C

void createlistR(LNode *&C, int a[], int n) {  //a待插入元素的数组LNode *s, *r; //s用来指向新申请的节点int i;LNode* C = new LNode; //申请C的头节点空间;C->next = NULL; //这句也不是必须的,但是写上吧,防止智障老师r = C;for (int i = 0; i < n; i++) {  //开始建立链表 ,注意是怎么插入的LNode *s = new LNode; //这个非常重要s->data = a[i]; //下面是尾插的核心r->next = s; //s插入到r的后面r = r->next; //r始终指向终端节点(当前s节点的位置,这个位置每次循环都变)}r->next = NULL;// 与上面案例不同,这个必须有,上面那个是因为之前的链表结尾有指向NULL的。
}

头插法建立链表

void createlistF(LNode *&C, int a[], int n) {  //注意,链表仅当头节点有变化的时候才加&LNode *s;int i;LNode* C = new LNode; //申请C的头节点空间;C->next = NULL;  //这个和上面的不同,这个是必须的;for (int i = 0; i < n; i++) {  //开始建立链表 ,注意是怎么插入的LNode *s = new LNode; //这个非常重要s->data = a[i];//下面是头插的核心s->next = C->next; //s所指新节点的指针域next指向C中的开始节点(头节点后一个节点)C->next = s;  //  头节点的指针域next指向s节点,使得s成为新的开始(头)节点}
}

A和B是两个单链表(带头节点),其中元素递增有序, 设置一个算法将A和并合并成一个按元素值递减有序的链表C,C由A和B节点组成  (注意和上面的区分)

void merge(LNode *A, LNode *B, LNode *&C) {     LNode *p = A->next; //p来追踪 A的最小值节点LNode *q = B->next; //q来追踪B的最小值节点LNode *s;  // s用来充当临时节点作用C = A;     //C用A的地址,如果 C未申请地址)C->next = NULL; //将C初始化为一个空链表 ,和上述不同,此处必须写//free(B);  //可有可无  此时把A也释放了也无妨 while (p != NULL && q != NULL) {  //p和q都不为空的时候,进行//下面用的头插法if (p->data <= q->data) {  //如果p指向的值小,那么将p插入到r后面s = p;p = p->next;   //p后移, 若不后移则下面操作会断掉p和后面节点的连接s->next = C->next;C->next = s;  //C链表的第一个节点(头节点的后一个节点)为s;}else {s = q;q = q->next;   s->next = C->next;C->next = s;  }}//注意下面的操作和头插的完全不同!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;}
}

查找链表C(带头节点)中是否存在一个值为x的节点,若存在,则删除该节点并返回1,否则返回0

int findeAndDelete(LNode *C, int x) {LNode *p, *q;p = C;/*查找部分开始*/while (p->next != NULL) {if (p->next->data == x) {  //注意这句 此时p是 值为x节点的上一个节点break;}p = p->next;}/*查找部分结束*/if (p->next == NULL) {return 0;  //没找到}else {/*删除部分开始*/q = p->next;p->next = p->next->next;delete q;/*删除部分结束*/return 1;}
}

已知递增有序的单链表A、B(A、B中元素个数分别为m、n,且A、B都带有头节点),分别存储了一个集合,设计算法以求出两个集合A和B的差集A-B(仅有A在A中出现而不在B中出现的元素所构成的集合),将差集保存在链表A中,并保持元素的递增有序性;

void difference(LNode *A, LNode *B) {LNode *p = A->next, *q = B->next;LNode *pre = A;LNode *r;while (p != NULL && q != NULL) {if (p->data < q->data) {pre = p;  //pre始终指向p的上一个节点p = p->next;  //p后移}else if (p->data>q->data) {q = q->next;}else {pre->next = p->next;r = p;p = p->next;delete r;  }}
}

递增非空单链表,设置一个算发,删除值域相同的节点

void delsll(LNode *L) {LNode *p = L->next;LNode *q;while (p->next != NULL) {if (p->data == p->next->data) {q = p->next;p->next = q->next;delete q;}else {p = p->next;}}
}

删除单链表(带头节点)中一个最小值的节点

void delminnode(LNode*L) {LNode *pre = L, *p = pre->next, *minp = p, *minpre = pre; while(p!=NULL){ //寻找最小值节点,minp以及前驱节点minpre;if (p->data < minp->data) {minp = p;minpre = pre;}pre = p;p = p->next;}minpre->next = minp->next; //删除*minp节点 delete minp;
}

链表逆序

void reversel(LNode*L) {LNode *p = L->next, *q;L->next = NULL;    //L充当新链表的表头while (p != NULL) { //p节点始终指向旧链表的开始节点  /* 头插法 */q = p->next; //q节点作为辅助结点来记录p的后继节点的位置p->next = L->next; //将p所指的节点插入到新的链表中L->next = p;p = q;}
}

将一个头节点为A的单链表(数据域为整型)分解成两个单链表A和B,使得A链表只含原有链表data域为奇数得节点,而B链表只含有原链表中data域为偶数的节点。保持原来的相对顺序。

void split2(LNode *A, LNode *&B) {LNode *p, *q, *r;LNode *B = new LNode;B->next = NULL; //也可以不写,最好写,每申请一个新节点的时候,将其指针域设置为NULL,//可以避免很多因链表终端节点而忘记设置NULL而产生的错误。也防止智障老师r = B; p = A; while (p->next != NULL) {  //p始终指向当前节点的前驱节点if (p->next->data % 2 == 0) {q = p->next; //q指向要从链表取下得节点p->next = q->next; q->next = NULL;r->next = q;  r = q;   //r始终指向B得最后一个节点}else {p = p->next;}}
}

逆序打印单链表中的数据   //注意也要会链表的反转

void reprint(LNode *L) {   if (L != NULL) {  //注意下面两句顺序reprint(L->next); //递归逆序打印开始节点后边的数据cout << L->data << "";  //打印开始节点中的数据;}
}

已知有一个带头节点的单链表只给出了头节点head,在不改变链表的前提下,设计一个尽可能高效的算发,查找链表中倒数第k个位置上的节点。若查找成功,算发输出该结点的data值,并返回1,否则返回0;

int findElem(LNode* head, int k) {  //可以自己尝试一下,先统计出链表的节点个数,然后顺序查找就简单得多LNode* p1 = head->next; LNode* p = head;int i = 1;while (p1 != NULL) {p1 = p1->next;i++;if (i > k) {p = p->next; //如果i>k,则p也往后移动}}if (p == head)return 0;  //说明链表不足k个节点,else {cout << p->data;return 1;}
}

链表的输出,

void print(LNode *L) {L = L->next;while (L != NULL) {cout << L->data<<" ";L = L->next;}cout << endl;
}

天勤数据结构代码——链表基本操作相关推荐

  1. 天勤数据结构代码——栈基本操作

    顺序栈 typedef struct SqStack {int data[maxSize]; //存放栈元素,数组大小,要开足够大(一般题目给)不给就开足够大,写注释.int top; //栈顶下标( ...

  2. 搬砖:数据结构之链表基本操作总结

    数据结构之链表基本操作总结 2017年05月11日 18:22:11 Lily_whl 阅读数:19151 https://blog.csdn.net/Lily_whl/article/details ...

  3. 数据结构-单链表基本操作-C语言代码

    单链表基本操作 1.头插法建立单链表 2.尾插法建立单链表 3.查找结点 3.修改结点 4.插入结点 5.删除结点 本篇只有c语言代码,具体思路讲解请看这篇博客:数据结构-线性结构-单链表 1.头插法 ...

  4. 数据结构-单链表基本操作(C语言实现)

    参考书:王道考研数据结构 (此贴为博主学习408的笔记,因博主也是学习者,个人总结如有错误欢迎指正.如有侵权请告知,马上删除致歉)​​ 单链表定义 单链表是线性表的链式存储,通过一组任意的存储单元来存 ...

  5. 数据结构-双链表基本操作(C语言实现)

    参考书:王道考研数据结构 (此贴为博主学习408的笔记,因博主也是学习者,个人总结如有错误欢迎指正.如有侵权请告知,马上删除致歉)​​ 一:双链表含义 双链表是在单链表的基础上增加了一个指向前驱结点的 ...

  6. 数据结构之链表基本操作

    数据结构:单链表基本操作 单链表学习:参考数据结构:单链表基本操作 涉及到单链表的基本操作有如下: int initList(linkList *); //初始化一个单链表,具有头指针,头结点,头结点 ...

  7. 数据结构-单链表基本操作带图完整详解

    1.什么是链表 链表是一种物理存储结构上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指 针链接次序实现的. 2.为什么要使用链表 在未学习链表时,我们常用的存储数据的方式无非就是数组.使 ...

  8. 数据结构,链表基本操作

    链表是数据结构中一种最基本的数据结构,它是用链式存储结构实现的线性表.它较顺序表而言在插入和删除时不必移动其后的元素.现在给你一些整数,然后会频繁地插入和删除其中的某些元素,会在其中某些时候让你查找某 ...

  9. 数据结构——单链表基本操作的实现

    单链表的基本操作的实现 单链表的初始化 判断链表是否为空 单链表的销毁 清空链表 求链表表长 取单链表中第i个元素的内容 根据指定值获取该值所在的位置(地址) 根据指定值获取该值所在的位置序号 插入元 ...

最新文章

  1. ecshop管理找不到index.php,前台出现找不到这样的目录,打不开某文件的提示
  2. leetcode算法题--删除回文子序列
  3. android电话拨号器
  4. 雅客EXCEL(4)-录入数据、超链接阻断、下拉菜单、横列转数列、alt+向下方向键、定位公式
  5. ASP.NET MVC easyUI-datagrid 分页
  6. Opencv3编程入门学习笔记(五)之通道分离(split)与合并(merge)
  7. 银行账务转账系统(事务处理)
  8. 图书管理系统详细设计说明书_书城管理系统不同模块在图书管理中体现不同作用...
  9. 高性能红黑二叉树实现
  10. 记录Yii2代码调试中出现的两个问题(截图展示)
  11. python下载网页图片并替换_python使用正则表达式分析网页中的图片并进行替换的方法...
  12. API支付代理版自动发卡平台源码
  13. 关系图谱在贝壳的构建和应用
  14. 01背包, 完全背包,多重背包
  15. Java 时间日期API总结
  16. 效果图网站、外包平台接单平台有哪些?
  17. 病毒分析师,你了解多少?
  18. 什么是深度学习?怎么学好深度学习?
  19. Python爬虫(5):豆瓣读书练手爬虫
  20. canvas画图--流畅没有齿痕的线,图像画线

热门文章

  1. 全新国内互联网一线大厂面经:阿里中间件+蚂蚁金服+头条研发岗+抖音+京东+美团+百度
  2. Foxmail收邮件时,怎么让发件人显示地址簿的名字?
  3. Tomcat 自定义启动startup.bat文件
  4. 数据库中的九种数据库对象
  5. 智能优化算法:多目标粒子群优化算法(MOPSO)
  6. java读取二进制流文件_java分别通过字节流、字符流、二进制读取文件的代码
  7. 电脑如何长截屏截图_您的意见很重要-截屏技术调查
  8. 传统方法学习IT已不再适用,快速提升的方法原来是这样
  9. 菜鸟学PCB贴片及无线模块功能介绍
  10. Endnote中文参考文献格式下载地址(官网)