有序链表的合并和删除
采用头插法或尾插法建立链表,从键盘输入递增有序的数据建立链表,编写算法实现有序链表 LIST1 和 LIST2 合并为一个 LIST3,要求LIST3 仍然是递增有序的链表,并对 LIST3 链表删除值相同的结点,即若链表中有多个结点具有相同的数据域值,只保留其中一个结点,其余的均从链表中删去,使得最后得到的链表中的所有节点的数据域都不相同,具有以下功能菜单:
(1) 建立链表的算法;
(2) 合并有序链表的算法;
(3) 删除相同结点的算法;
(4) 输出链表;
源代码:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct Node{
int data;
struct Node * next;
};
typedef struct Node * TNode;
TNode create();
void Insert(TNode list,int data);
void Print(TNode list);
void Combin(TNode , TNode ,TNode );
int main(){
TNode list1,list2,list3;
list1 = create();
list2 = create();
list3 = create();
int data;
printf("请输入list1的数据(以回车结束):");
while(1){
scanf("%d",&data);
Insert(list1,data);
if(getchar()=='\n') break;
}
Print(list1);
printf("请输入list2的数据:");
while(1){
scanf("%d",&data);
Insert(list2,data);
if(getchar()=='\n') break;
}
Print(list2);
Combin(list1,list2,list3);
Print(list3);
return 0;
}
TNode create(){
TNode head;
head = (TNode)malloc(sizeof(struct Node));
head->data = NULL;
head->next = NULL;
return head;
}
void Insert(TNode list,int data){
TNode pin,plist;
pin = (TNode)malloc(sizeof(struct Node));
pin->data=data;
pin->next=NULL;
if(data==NULL) {printf("输入为空\n"); return ;}
plist = list;
while(plist->next!=NULL){
plist=plist->next;
}
plist->next=pin;
}
void Print(TNode list){
TNode p;
p=list->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void Combin(TNode list1, TNode list2,TNode list3){
TNode p1,p2,head;
p1=list1->next;
p2=list2->next;
head = list3;
while(1){
if (p1==NULL&&p2==NULL) return ; //都为空,退出
else if(p1==NULL&&p2!=NULL){ //list1空
head->next=p2;
head=head->next;
p2=p2->next;
}
else if(p2==NULL&&p1!=NULL){//list2空
head->next ==p1;
p1=p1->next;
head = head->next;
}
else {
if(p1->data<p2->data){//list1小于list2
head->next=p1;
head = head->next;
p1 = p1->next;
}
else if (p1->data>p2->data){//list1大于list2
head->next=p2;
head = head->next;
p2 = p2->next;
}
else if(p1->data==p2->data){ //list1等于list2
head->next = p1;
head = head->next;
p1 = p1->next;
p2 = p2->next;
}
}
}
}