【数据结构】单链表应用1

1.删除链表A中与B重复的元素,输出单链表A

主要是用到查找和删除算法

//扣掉A中与B中重复的元素,输出A链表
#include<stdio.h>
 
typedef struct Lnode{
	int data;
	struct Lnode *next;
}Lnode,*LinkList;
void DeleteList(LinkList &A,LinkList &B);

void InsertList(LinkList &L,int n,int a[]);
int main(){
	LinkList A,B;
	Lnode *p;
	int a[]={2,3,6,7,9,14,56,45,65,67};//两个数组
	int b[]={3,4,7,11,34,54,45,25};
	InsertList(A,sizeof(a)/sizeof(a[0]),a);
	InsertList(B,sizeof(b)/sizeof(b[0]),b);
	int ListLengthA=sizeof(a)/sizeof(a[0]);
	int ListLengthB=sizeof(b)/sizeof(b[0]);
	
	p=A->next;
	while(p){
		printf("%d ",p->data); 
		p=p->next;
	}	
	printf("\n");
	p=B->next;
	while(p){
		printf("%d ",p->data); 
		p=p->next;
	}
	printf("\n");
    DeleteList(A,B);
    p=A->next;
	while(p){
		printf("%d ",p->data); 
		p=p->next;
	}
}
//尾插法建立单链表,将数组里数变到单链表中
void InsertList(LinkList &L,int n,int a[]){
	L=new Lnode;
	L->next=NULL;
	Lnode *p;
	Lnode *r=L;
	int i;
	for(i=0;i<n;i++){
		p=new Lnode;
		p->data=a[i];
		r->next=p;
		r=p;
	}
	r->next=NULL;//设置A,B链表的尾结点指针域都为空
}
//这个函数里面主要是进行查找和删除工作
void DeleteList(LinkList &A,LinkList &B){
//为删除进行定义准备
	Lnode *pre;                      
	Lnode *p,*q,*r;
	pre=A;
//进行查找:依此取A中的元素,去B中查找	
    p=A->next;
	while(p){ 
		q=B->next;
		while(q&&q->data!=p->data){
			q=q->next;
		}
		//如果查找出的结果是找到了,那么进行删除,删除p指针所指的元素
		if(q){
			pre->next=p->next;
			r=p;
			p=p->next;
			delete r;
		//如果查找结果为没找到,则让pre指针指向将要进行被查找的元素的前一个
		}else{ 
			pre=p;
			p=p->next;
		}
	}
}
//删除算法的步骤就是1.找到要删除元素的前一个指针2.另设变量,开始链接3.释放要删除元素的指针

//这道题的pre指针就充当着将要删除元素的前一个指针

2.两个一般线性表合并

主要是用到查找和插入算法

#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode{
	int data;
	struct Lnode *next;
}Lnode,*LinkList;
void InsertList(LinkList &L,int n,int a[]);
void MergeList(LinkList &A,LinkList &B);
int main(){
	LinkList A,B,C;
	Lnode *p;
	int a[]={7,5,3,11};//两个数组
	int b[]={2,6,3};
	InsertList(A,sizeof(a)/sizeof(a[0]),a);
	InsertList(B,sizeof(b)/sizeof(b[0]),b);
	   
	p=A->next;
	while(p){
		printf("%d ",p->data); 
		p=p->next;
	}
	printf("\n");
	p=B->next;
	while(p){
		printf("%d ",p->data); 
		p=p->next;
	}
	printf("\n");
	MergeList(A,B);
	p=A->next;
	while(p){
		printf("%d ",p->data);
		p=p->next;
	}
}
 //尾插法建立单链表,将数组里数变到单链表中
void InsertList(LinkList &L,int n,int a[]){
	L=new Lnode; 
	L->next=NULL;
	Lnode *p;
	Lnode *r=L;
	int i;
	for(i=0;i<n;i++){
		p=new Lnode;
		p->data=a[i];
		r->next=p;
		r=p;
	}
	r->next=NULL;
}
//这个函数主要用到查找和插入
void MergeList(LinkList &A,LinkList &B){ 
//进行插入工作的准备
	Lnode *p,*q,*r;
	p=A->next;
	int j=1;
	while(p&&j<4){
		p=p->next;//让p最终指向链表A的最后一个结点
		j++;
	}
	//依此取B元素,在A链中查找
	q=B->next;
	while(q){
		r=A->next;
		while(r&&r->data!=q->data){
			r=r->next;
		}
		if(!r){ //如果r为空,则说明B中的这个元素要插入在A后
		//下面是插入的算法
			LinkList s;
			s=new Lnode;
			s->data=q->data;
			s->next=p->next;
			p->next=s;
		}
		q=q->next;
	}
}
	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值