c语言实现两个顺序表的合并

将共同拥有的元素只存其一

一个算法给你(假如是升序,并且不重复)

while(表1不结束 && 表2不结束) {

    if (表1结束 || 表1.当前值>表2.当前值) {表2.当前值插入新表;表2.当前值向后移动}

    else if (表2结束 || 表1.当前值<表2.当前值) {表1.当前值插入新表;表1.当前值向后移动}

    else if (表1.当前值=表2.当前值) {表1.当前值插入新表;表1.当前值和表2.当前值向后移动}

}

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
struct student {
    int num;
    struct student  *next;
};
void print(struct student *head) {
    struct student *p;
    p=head;
    char s=' ';
    if(head==NULL) {
        printf("该链表为空");
    }
    if(head!=NULL) {
        do {
            printf("%c%c%d",s,s,p->num);
            p=p->next;
        } while(p!=NULL);
        printf("\n");
    }
}
struct student *creatb() {
    struct student *head;
    struct student *p1,*p2;
    int n=0;
    p1=p2=(struct student*)malloc(sizeof(struct student));
    scanf("%d",&p1->num);
    head=NULL;
    while(p1->num!=0) {
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(struct student*)malloc(sizeof(struct student));
        scanf("%d",&p1->num);
    }
    p2->next=NULL;
    return head;
}
int main() {
    struct student *head1,*head2,*head3;
    head1=NULL;
    head2=NULL;
    head3=NULL;
    printf("请输入单链表La,输入0表示输入结束:\n");
    head1=creatb();
    printf("输入的链表为:");
    print(head1);
    printf("请输入单链表Lb,输入0表示输入结束:\n");
    head2=creatb();
    printf("输入的链表为:");
    print(head2);
    struct student *a,*b,*c, *tmpNode;
    a=head1->next;
    b=head2;//
    head3=c=head1;
    while(a != NULL || b != NULL) {
        if(b == NULL || (a != NULL && a->num < b->num)) {
            c->next=a;
            c=a;
            a=a->next;
        } else if(a == NULL || (b != NULL && a->num > b->num)) {
            c->next=b;
            c=b;
            b=b->next;
        } else if (a != NULL && b != NULL) {
            c->next=a;
            c=a;
            a=a->next;
            tmpNode = b;
            b = b->next;
            free(tmpNode);
        }
    }
    c->next=NULL;
    printf("合并后的有序链表为:");
    print(head3);
    c = head3;
    while(c) {
        tmpNode = c;
        c = c->next;
        free(tmpNode);
    }
    return 0;
}

追问

不能假设他不重复啊,要考虑他有重复的情况的啊

追答

我假设的是各自里面没有重复

追问

这个是顺序表吗?好像是链表啊?

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-24
两层for循环,第一层表示第一个集合,第二层表示第二个集合,用一个变量flag标记有没有出现过,如果出现了不管,如果没有出现就增加到第一个集合中。最后输出第一个集合的数就好了..追问

要的是代码诶。思路我也是这样的

第2个回答  2013-09-24
思路,先合并在排序,合并时候注意一个不变,你一个插入,检查有,就pass,没有再插入,在排序,排序方法很多自己选。追问

这个思路我也知道啊,要求代码

追答

。。。。最好有个具体的描述,顺序表存的是数字吗?

追问

可以是数字啊,元素类型可以是多种的啊

第3个回答  2017-10-26
这是链表傻X
第4个回答  2013-09-24
你可以好好去看一下《数据结构》中链表这一章,介绍的比较详细,合并、翻转、增加、删除、更新等都有

c语言实现两个顺序表的合并
else if (表2结束 || 表1.当前值<表2.当前值) {表1.当前值插入新表;表1.当前值向后移动} else if (表1.当前值=表2.当前值) {表1.当前值插入新表;表1.当前值和表2.当前值向后移动} } include<stdio.h>#include<malloc.h>#include<stdlib.h>struct student { int num; str...

如何用c语言编合并两个顺序线性表的程序?
\/*参数越界*\/ else *pelem=L.base[index]; returnflg;} \/*求顺序表长度*\/int ListLen(SeqList L){ returnL.len; } \/*在顺序表中指定序号位置插入元素*\/BOOL ListInsert(SeqList *pL, int pos, ListDT d){ BOOLflg=TRUE; inti; if...

...合并后的结果放在第一个顺序表中(两表无相同元素
int InsElem(SqList &sq,ElemType x,int i) \/*插入元素*\/{int j;if (i<1 || i>sq.length+1) \/*无效的参数i*\/return 0;for (j=sq.length;j>i-1;j--) \/\/这里sq.data[j]=sq.data[j-1];sq.data[i-1]=x; \/*在位置i处放入x*\/sq.length++; \/*线性表长度增1*...

C语言 求两个有序顺序表的并集
int MergeArray(int* arr1, int len1, int* arr2, int len2, int** arrRst){ arrRst = new int[len1+len2];int* arrRstt = *arrRst;if (*arrRst != 0){ int *p = arr1;int i = 0;int i1 = 0,i2 = 0;while(i1<len1 || i2<len2){ p = arr1;while (*p<=*...

用C语言编写算法实现将两个递增顺序表合并为一个递增顺序表
1.最容易的办法就是把两个表保存在一个新的表里,然后冒泡排序(就是这么暴力。)2.不过这个问题用指针实现最方便了。两个指针分别指着两个递增表:比较指针所指的值大小,将小的那个保存在新的表里,然后将小的那个指针往前走一步。再比较,再保存,再走...直到其中一个表走完,把另一个表剩...

C语言 顺序表的合并
1、c语言是没有引用的,可以使用一个const指针来模拟引用void InitList(SqList *L){L->last=0;}。2、这个是顺序表的初始化,不用管int LenList(SqList L){return L.last;}。3、插入操作,这一步是关键,插入顺序表int InsertList(SqList *L,int i,ElemType x){int k;if(L->last>=MAX...

编写一个函数实现两个按升序排列的顺序表的合并操作,要用C语言编写,能...
\/*采用数组实现 int merge(int* a,int* b,int*c,int alen,int blen){ int i=0,j=0,k=0;\/\/每次将a和b中当前的元素进行比较,并将小的一个存入到c中 while(i<alen && j<blen){ if(a[i]<b[j])c[k]=a[i++];else c[k]=b[j++];k++;} \/\/其中一个数组已经结束,将另一...

c语言怎么合并两个动态顺序表?
将第一个表末尾元素的next指针指向第二个表开始元素

C语言顺序表 合并
1、应该是编译时就存在问题吧,你在函数SequenceList中的语句table1[i] = scanf("%d",k);中的k未定义,导致有问题。解决这个问题要么将在main中定义k的语句移到SequenceList中,要么将k定义成全局变量;2、另外scanf("%d",k)请改成scanf("%d",&k)或者scanf("%d",&(table1[i]);。

C语言合并两个线性表,输入为表L1=(2,3),L2=(3,4,6)顺序已知,输出为表...
\/*建立一个空表*\/ sqlist initlist(){ sqlist l;l.a = (int*)malloc(listinitsize*sizeof(int));if(!l.a)exit(OVERFLOW);l.length = 0;l.listsize = listinitsize;return l;} sqlist creatlist(sqlist *l, int num){ int j;int p;for(j = 0; j < num; ++j){ scanf("...

相似回答