用C语言实现两个链表查集
来源:互联网 发布:pc围棋软件 编辑:程序博客网 时间:2024/06/18 14:43
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}LinkList;
//创建链表
LinkList *CreatLink(LinkList *head,int num){
LinkList *h,*p;
head=(LinkList*)malloc(sizeof(LinkList));
head->next=NULL;
h=head;
for(int i=0;i<num;i++){
p=(LinkList*)malloc(sizeof(LinkList));
scanf("%d",&p->data);
p->next=head->next;
head->next=p;
}
return head;
}
//排序
LinkList *sortlink(LinkList *head){
LinkList *p,*q;
int temp;
for(p=head->next;p!=NULL;p=p->next){
for(q=p;q!=NULL;q=q->next){
if(p->data>q->data){
temp=p->data;
p->data=q->data;
q->data=temp;
}
}
}
return head;
}
//查集
LinkList *Sublink(LinkList *head,LinkList *head1,LinkList *head2){
LinkList *p,*p1,*p2;
head=(LinkList*)malloc(sizeof(LinkList));
head->next=NULL;
p1=head1->next;
p2=head2->next;
head=p=head1;
while(p1&&p2){
if(p1->data==p2->data){
p->next=p1->next;free(p1);p1=p->next;
}else if(p1->data<p2->data){
p=p1;
p1=p1->next;
}else{
p2=p2->next;
}
}
p2=head2;
while(p2){
p=p2;
p2=p2->next;
free(p);
}
return head;
}
//打印列表
void printlink(LinkList *head){
LinkList *p;
p=head->next;
if(!p){
printf("The link is nothing!");
exit(0);
}
while(p){
printf("%d ",p->data);
p=p->next;
}
}
int main(){
LinkList *head,*head1,*head2;
int num1,num2;
printf("The first link legth:");
scanf("%d",&num1);
head1=CreatLink(head1,num1);
sortlink(head1);
printlink(head1);
printf("\n");
printf("The second link legth:");
scanf("%d",&num2);
head2=CreatLink(head2,num2);
sortlink(head2);
printlink(head2);
printf("\n");
head=Sublink(head,head1,head2);
printf("查集链表为:");
printlink(head);
}
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}LinkList;
//创建链表
LinkList *CreatLink(LinkList *head,int num){
LinkList *h,*p;
head=(LinkList*)malloc(sizeof(LinkList));
head->next=NULL;
h=head;
for(int i=0;i<num;i++){
p=(LinkList*)malloc(sizeof(LinkList));
scanf("%d",&p->data);
p->next=head->next;
head->next=p;
}
return head;
}
//排序
LinkList *sortlink(LinkList *head){
LinkList *p,*q;
int temp;
for(p=head->next;p!=NULL;p=p->next){
for(q=p;q!=NULL;q=q->next){
if(p->data>q->data){
temp=p->data;
p->data=q->data;
q->data=temp;
}
}
}
return head;
}
//查集
LinkList *Sublink(LinkList *head,LinkList *head1,LinkList *head2){
LinkList *p,*p1,*p2;
head=(LinkList*)malloc(sizeof(LinkList));
head->next=NULL;
p1=head1->next;
p2=head2->next;
head=p=head1;
while(p1&&p2){
if(p1->data==p2->data){
p->next=p1->next;free(p1);p1=p->next;
}else if(p1->data<p2->data){
p=p1;
p1=p1->next;
}else{
p2=p2->next;
}
}
p2=head2;
while(p2){
p=p2;
p2=p2->next;
free(p);
}
return head;
}
//打印列表
void printlink(LinkList *head){
LinkList *p;
p=head->next;
if(!p){
printf("The link is nothing!");
exit(0);
}
while(p){
printf("%d ",p->data);
p=p->next;
}
}
int main(){
LinkList *head,*head1,*head2;
int num1,num2;
printf("The first link legth:");
scanf("%d",&num1);
head1=CreatLink(head1,num1);
sortlink(head1);
printlink(head1);
printf("\n");
printf("The second link legth:");
scanf("%d",&num2);
head2=CreatLink(head2,num2);
sortlink(head2);
printlink(head2);
printf("\n");
head=Sublink(head,head1,head2);
printf("查集链表为:");
printlink(head);
}
阅读全文
0 0
- 用C语言实现两个链表查集
- 用c语言实现 计算两个数的最大公约数
- C语言 两个分数的四则运算,用函数调用实现
- 用c语言实现比较两个分数的大小
- C语言用指针实现两个数组值互换
- C语言实现交换两个数
- C语言 实现两个数组内容交换
- C语言实现两个大数相乘
- 两个数之和C语言实现
- C语言实现两个复数相加
- c语言实现两个数的平均值
- 两个栈实现队列功能C语言实现能运行!
- 用两个栈实现二进制到八进制的转换C语言
- 用c语言实现两个数的最大公因数与最小公倍数
- c语言 2个整数的交换 用两个变量来实现
- C语言变参函数的两个实现
- 题目1200:最大的两个数 ACM C语言实现
- C语言生成2000w行数据的两个实现
- web 基础(一) 简介及HTML
- NIO方式实现文件的快速拷贝
- 微信小程序组件(六)form
- ERROR LNK2019:无法解析的外部的符号 _sscanf或者_vsprintf
- 卷积神经网络基础
- 用C语言实现两个链表查集
- Hash表(一)------原理解析
- Android 环信SDK集成 即时通讯IM 一个很LOW的测试Demo
- 基于注解的spring多数据源配置和使用
- 优先队列(堆)
- Python 窗体(tkinter)下拉列表框(Combobox)
- 关于跨域访问的扯淡
- 我有一个还在蹒跚学步的小孩是否应该学习Python?
- Python正则表达式