编程实现将两个有序的线性表进行合并,要求同样的数据元素只出现一次。
解题思路: 由于两个线性表中的元素呈有序排列,在进行合并的时候,依次比较,哪个线性表的元素值小,就先将这个元素复制到新的线性表中,若两个元素相等,则复制一个即可,这样一直到其中的一个线性表结束,然后将剩余的线性表复制到新的线性表中即可。
#include<stdio.h> //预编译命令
#include<iostream.h>
struct list//定义结构体
{
int num;
list*next;
};
list*head,*end; //定义全局变量
list*creat()//创建链表的函数
{
list*p=NULL;
list*q=NULL;
head=NULL;
int num;
printf("Input number:\n");
scanf("%d",&num);
while(num!=0)
{
p=new list; //开辟空间
p->num=num;
if(head==NULL)
head=p;
else
q->next=p;
q=p;
scanf("%d",&num);
}
end=q; //将链表的结尾最后一个结点赋给end
end->next=head; //让最后一个结点的的下个结点的地址不为空而指向头指针
return(head);
}
void print(list*head)//打印循环链表的函数
{
int k=0;
list*r=head;
do{
cout.width(2);
k=k+1;
cout<<k<<":"<<r->num<<endl;
r=r->next;
}while(r!=head);
}
void insert(list*pHead,list*pNode) //插入接点的函数
{
list*q,*r;//第一种情况,链表为空
if(pHead==NULL)
{
pHead=pNode; //链表头指向pNode
return; //完成插入操作,返回
}
//第二种情况,pNode结点num的值小于链表头结点num的值
//则将pNode的值插到链表头部
if(pNode->num<=pHead->num)
{
pNode->next=pHead;
pHead=pNode;
return;
}
//第三种情况,循环查找正确位置
r=pHead;
q=pHead->next;
while(q!=pHead)
{
if(pNode->num>q->num)
{
r=q;
q=q->next;
}
else
break;
}r->next=pNode;
pNode->next=q;
}
list*together(list*p1,list*p2) //定义两个链表合并的函数
{
list*q,*r;
q=p2;
do
{
r=new list; //开辟空间
r->num=q->num;
//将q的值赋给r
r->next=NULL; //让r的下一个指针的地址为空,目的是使它成为一个独立的结点
insert(p1,r); //调用插入结点的函数
q=q->next; //指针向后拨一个接点
}while(q!=p2); //当在最后一个结点时停止循环
return(p1); //返回头指针
}
void main() //主函数
{
list*list1,*list2;
printf("Input list1\n");
printf("If number is 0,stop inputing\n");
printf("数据请从小到大输入\n");
list1=creat(); //调用创建链表的函数
print(list1); //打印第一个链表
printf("Input list2\n");
printf("If number is 0,stop inputing\n");
printf("数据请从小到大输入\n");
list2=creat(); //调用创建链表的函数
print(list2); //打印第二个循环链表
head=together(list1,list2); //调用合并两个链表的函数
printf("The new list is:\n");
print(head); //打印最后结果
}
改这个程序,要求不能有重复输出。