8---------单链表算法的简单应用和巩固
2017-12-20 14:19
393 查看
单链表算法主要注意处理好指针的指向问题
链表的逆置
两个链表的交集合问题(链表初始无序)
两个链表的并集问题(链表初始无序)
链表A-链表B差集问题(链表初始无序)
找到单链表倒数第k个结点并打印
链表的逆置
两个链表的交集合问题(链表初始无序)
两个链表的并集问题(链表初始无序)
链表A-链表B差集问题(链表初始无序)
找到单链表倒数第k个结点并打印
#include <stdio.h> #include <stdlib.h> /**带头结点的单链表 * 链表的逆置 * 两个链表的交集合问题(链表初始无序) * 两个链表的并集问题(链表初始无序) * 链表A-链表B差集问题(链表初始无序) * 找到单链表倒数第k个结点并打印 */ //链表结点结构体定义 typedef struct Node{ int data; struct Node * next; }Node; //链表的逆置 void inverse(Node * node){ Node * q,* p; q = node -> next; while(q){ p = q->next; q->next = node->next; node -> next = q; q = p; } } //链表的交集合问题,AnB=C,不破坏原本A和B链表结构 void itersection(Node * A,Node * B,Node * C){ Node * q = A->next; Node * p = B->next; Node * c = C; //c本身是带头结点的单链表 Node * s; while(q){ while(p){ if(p->data == q->data){ s = (Node *)malloc(sizeof(Node)); s -> data = q->data; s -> next = NULL; c ->next = s; c = c->next; } p = p->next; } q = q->next; } } //两个链表的并集问题,AuB = C,思路,先将一个链表的所有数据线存到C,然后再B链表中的结点一一于C中的结点比较,如果有相同的就不加入 void combine(Node * A,Node * B,Node * C){ Node * q = A->next; Node * p = B->next; Node * justc; Node * c = C; //C本身是带头结点 Node * s; int flag = 0; while(q){ flag = 0; justc = C->next; while(justc){ //重复的就不加入到该C链表中 if(q->data == justc ->data){ flag = 1; justc = justc ->next; } } if(!flag){ s = (Node *)malloc(sizeof(Node)); s ->data = q->data; s->next = NULL; c -> next = s; c = c->next; } q = q->next; } while(p){ flag = 0; justc = C->next; while(justc){ if(c->data == p->data){ flag = 1; } } if(!flag){ s = (Node *)malloc(sizeof(Node)); s -> data = p->data; s -> next = NULL; c-> next = s; c = c->next; } p = p->next; } } //计算A-B = C void cut(Node * A,Node * B,Node * C){ Node * p = A->next; Node * q = B->next; Node * c = C; Node * s; int flag; while(p){ flag = 0; while(q){ if(q -> data == p -> data){ flag = 1; } q = q->next; } if(!flag){ s = (Node *)malloc(sizeof(Node)); s -> data = p -> data; s -> next = NULL; c -> next = s; c = c->next; } p = p->next; } } //找到单链表倒数第k个结点并打印,可以开始计数,当记时到链表的n个位置的时候,就让一个指针指向初始位置的结点,然后后移 struct Node * getInverseV(Node * node,int v){ Node * p = node -> next; Node * q = NULL; int n = 0; while(p){ n++; if(v == n){ q = node -> next; }else if(n > v){ q = p -> next; } p = p->next; } return q; } int main(){ return 0; }
相关文章推荐
- (数据结构)图的应用,一个简单的学校地图.包含的内容:图的最短路径算法 和 图的深度优先遍历算法
- 【算法学习笔记】53.单调队列的简单应用 SJTU OJ 1034 二哥的金链
- C 算法 -----链表在页帧和页面转换的应用
- ZOJ 1298题解,想到算法就不难了,要求多米诺骨牌最后落下的位置。这是Dijkstra算法的简单应用。设立的几个关键点,都是从1开始倒比如只有两个点1 2,最后牌倒得位置是2
- STL在算法比赛中简单应用
- 单链表的应用———简单的通讯录
- 算法最简单之_链表
- 链表的头文件以及一些简单的应用
- 一些简单的链表算法一
- 简单算法 - 找到链表的中间点和倒数第K个节点(普通方法和快慢指针方法开销一样)
- XMind简单应用_《算法》目录
- 一步一步复习数据结构和算法基础-栈的简单应用(1)
- 数据结构————链表及其简单应用
- 数据结构与算法学习笔记——堆栈及其应用(10以内简单四则计算器)
- SVM算法简单应用
- 黑白棋算法简单实现与基于Qt的GUI编程的综合应用
- kernel 中链表的简单应用
- 【简单算法】21.删除链表的结点
- (四)一个简单的删除链表中某个元素的算法
- LinkedList链表实现队列应用的简单实例