两链表取相同元素

题目:设A、B是两个单链表(带头结点),其中元素递增有序,设计一个算法从A、B中的公共元素产生单链表C,要求不破坏A、B节点
分析:
        要求不破坏A、B节点,故我们需要重新创建分配节点空间,来进行连接。为寻找公共元素,每遍历A中的一个元素,都去
        与B中元素一一比较,同则取值给另一空间节点,连接到C上。时间复杂度为O(n^2)。
        因为这两个链表是递增有序的,那么我们可以设置两个指针同步比较,相同则加入c,不同小的那个往后移,直至到链表末尾
        这样的时间复杂度为O(n).

代码:

struct Link {
	int data;
	struct Link *next;
};
#include <stdlib.h>
#include <stdio.h>
void linkCommon(Link *a, Link *b, Link *c ) {
	struct Link *lc = c,*la=a->next,*lb=b->next,*rc=lc;
	while (la) {
		while (lb) {
			if (la->data==lb->data) {//如果是公共元素
				struct Link *p = (struct Link*)malloc(sizeof(struct Link));
				p->data = la->data;
				rc->next = p;//采用尾插法
				rc = p;
				break;
			}
			lb = lb->next;
		}
		la = la->next;
		lb = b->next;
	}
	rc->next = NULL;//最后一个节点指针需要指向NULL。
}
void listCommon(Link *a,Link *b,Link *c) {
	struct Link *rc = c, *la = a->next, *lb = b->next;
	while (la&&lb) {
		if (la->data==lb->data) {
			struct Link *p = (struct Link*)malloc(sizeof(struct Link));
			p->data = la->data;
			p->next = NULL;
			rc->next = p;
			rc = p;
			la = la->next;
			lb = lb->next;
		}
		else {
			la->data < lb->data ? la = la->next : lb = lb->next;
		}
	}
	rc->next = NULL;
}
int main() {
	struct Link *a, *b;
	Link *createLink();
	void printfNowLink(Link *);
	a = createLink();
	b = createLink();
	struct Link *c = (struct Link*)malloc(sizeof(struct Link));
	c->next = NULL;
	//linkCommon(a,b,c);
	listCommon(a,b,c);
	printfNowLink(c);
	return 0;
}

这里采用了两个方法,方法二效率更加

你所经历的苦难终将成为你一生的财富!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实验 一 线性表的基本操作实现及其应用 一、实验目的 1、熟练掌握线性表的基本操作在种存储结构上的实现。 2、会用线性链表解决简单的实际问题。 二、实验内容 题目一 链表基本操作 该程序的功能是实现单链表的定义和操作。该程序包括单链表结构类型以及对单链表操 作的具体的函数定义和主函数。其中,程序中的单链表(带头结点)结点为结构类型, 结点值为整型。单链表操作的选择以菜单形式出现,如下所示: please input the operation: 1.初始化 2.清空 3.求链表长度 4.检查链表是否为空 5.检查链表是否为满 6.遍历链表(设为输出元素)7.从链表中查元素 8.从链表中查与给定元素相同元素在表中的位置 9.向链表中插入元素 10. 从链表中删除元素 其他键退出。。。。。 题目二 约瑟夫环问题 设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一个正整数 密码。开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报 数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重 新从1报数。如此下去,直到所有人全部出列为止。令n最大值30。要求设计一个程序 模拟此过程,求出出列编号序列。 struct node //结点结构 { int number; /* 人的序号 */ int cipher; /* 密码 */ struct node *next; /* 指向下一个节点的指针 */ }; 三.实验步骤 题目一 链表基本操作 (一)、数据结构与核心算法的设计描述 1、单链表的结点类型定义 /* 定义DataType为int类型 */ typedef int DataType; /* 单链表的结点类型 */ typedef struct LNode { DataType data; struct LNode *next; }LNode,*LinkedList; 2、初始化单链表 LinkedList LinkedListInit() { //函数功能:对链表进行初始化 参数:链表(linklist L) 成功初始化返回1,否则返回0 } 3、清空单链表 void LinkedListClear(LinkedList &L) {//函数功能:把链表清空 参数:链表(linklist L) 成功清空链表返回1 } 4、 检查单链表是否为空 int LinkedListEmpty(LinkedList L) { //函数功能:判断链表是否为空 参数:链表(linklist L) 链表为空时返回0,不为空返回1 } 5、 遍历单链表 void LinkedListTraverse(LinkedList L) { //函数功能:遍历链表,输出每个节点的elem值 参数:链表(linklist L) 通过循环逐个输出节点的elem值 } 6、 求单链表的长度 int LinkedListLength(LinkedList L) { //函数功能:返回链表的长度 参数:链表(linklist L) 函数返回链表的长度 } 7、 从单链表表中查元素 LinkedList LinkedListGet(LinkedList L,int i) { //函数功能: 从链表中查有无给定元素 参数;链表(linklist L),给定元素(int i) 如果链表中有给定元素(i)则返回1,否则返回0 } 8、从单链表表中查与给定元素相同元素链表中的位置 LinkedList LinkedListLocate(LinkedList L, DataType x) {//函数功能: 从链表中查给定元素的位置 参数;链表(linklist L),给定元素(int i) 如果链表中有给定元素i则返回元素的位置, 没有则返回0 } 9、 向单链表中插入元素 void LinkedListInsert(LinkedList &L,int i,DataType x) { // L 为带头结点的单链表的头指针,本算法 // 在链表中第i 个结点之前插入新的元素 x } 10、 从单链表中删除元素 void LinkedListDel(LinkedList &L,DataType x) { 删除以 L 为头指针的单链表中第 i 个结点 } (二)、函数调用及主函数设计 zhujiemian(); cin>>a; do { switch(a) { case 1: if(init(L)==1) cout<<"成功初始化!"<<endl; else cout<<"初始化失败!"<<endl; break; case 2: if(makeempty(L)==1) cout<<"链表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北街学长

你的鼓励使我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值