动态构建顺序表,合并两个顺序表(C语言)

本程序实现将两个元素非递减排列的顺序表合并
以下程序用VC++6.0调试,确认正确无误。

#include<stdio.h>
#include<stdlib.h>

#define MaxSize 100
#define listincrement 10
#define begin_size 5    //表初始长度
typedef int ElemType;



typedef struct      //定义
{
    ElemType *elem;
    int length;
    int listsize;
}SeqList;




void Init_SeqList(SeqList *L)  //创建空表
{
    L->elem = (int*)malloc(MaxSize*sizeof(ElemType));
    if(!L->elem) exit(0);
    L->length = 0;
    L->listsize = MaxSize;
}





void Put_SeqList(SeqList *L)  //打印表
{
    ElemType *begin, *end;
    begin = L->elem;
    end   = &(L->elem[L->length-1]);
    if(begin == end) exit(0);
    for(; begin < end ; begin++) printf("%d->",*begin);
    printf("%d\n",*end);
}





void Insert_SeqList(SeqList *L, int i, ElemType x)  //插入元素
{
    ElemType *newbase, *insertptr, *p;
    if(i < 1 || i > L->length+1) exit(0);
    if(L->length >= L->listsize) 
    {
        newbase=(ElemType*)realloc(L->elem, (L->listsize+listincrement)*sizeof(ElemType));
        if(!newbase) exit(0);
        L->elem = newbase;
        L->listsize += listincrement;
    }
    insertptr = &(L->elem[i-1]);
    p = &(L->elem[L->length-1]);
    for(;p >= insertptr; p--)
        *(p+1) = *p;
    *insertptr = x;
    L->length++ ;
}






/********以下为合并算法部分*******/


void Merge_SeqList(SeqList La, SeqList Lb, SeqList *Lc)  //已知La,Lb的元素非递减排列
{ 
    ElemType *pa, *pb, *pc, *pa_last, *pb_last;
    pa = La.elem; pb = Lb.elem;
    Lc->length = La.length + Lb.length; Lc->listsize = Lc->length;
    pc = (ElemType*)malloc(Lc->listsize*sizeof(ElemType));  //分配存储空间
    if(!Lc->elem) exit(0);
    Lc->elem = pc;   //存储地址
    pa_last = La.elem + La.length-1; 
    pb_last = Lb.elem + Lb.length-1;
    while(pa <= pa_last && pb <= pb_last)  //归并
        if(*pa <= *pb)     *pc++ = *pa++;
        else    *pc++ = *pb++;
    while(pa <= pa_last) *pc++ = *pa++;
    while(pb <= pb_last) *pc++ = *pb++;
}




/**********以下为main函数*******/


int main() //实现创建两个顺序表,然后将两个表归并
{
    SeqList La, Lb, Lc;
    ElemType x;
    int i;

    Init_SeqList(&La);    //初始化
    Init_SeqList(&Lb);
    Init_SeqList(&Lc);


    printf("请输入表La\n");    //创建La Lb
    for(i = 1; i <= begin_size; i++)  
    {
        scanf("%d",&x);
        Insert_SeqList(&La,i,x);
    }
    printf("请输入表Lb\n");
    for(i = 1; i <= begin_size; i++)
    {
        scanf("%d",&x);
        Insert_SeqList(&Lb,i,x);
    }


    Merge_SeqList(La,Lb,&Lc);  //归并
    Put_SeqList(&Lc);

    return 0;
}

程序输出结果

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 可以使用两个指针分别指向两个顺序表,比较两个顺序表当前指向元素的大小,小的元素加入新的顺序表,然后将指针后移,直到两个指针到达两个顺序表的末尾。如果两个元素相等,则将其加入新的顺序表,并将两个指针都后移一位。最后,新的顺序表中就是两个顺序表合并以及相等的元素构建的新的顺序表。 ### 回答2: 利用C语言编写程序,实现两个顺序表合并以及构建相等元素的新顺序表的过程可以分为以下步骤: 1. 为两个顺序表分别定义结构体,包含数据元素和当前表长等属性。 ```c typedef struct { int data[MAX_SIZE]; int length; } SeqList; ``` 2. 编写合并函数,将两个顺序表合并成一个新的顺序表。 ```c void merge(SeqList list1, SeqList list2, SeqList *mergedList) { int i; // 复制list1的元素到mergedList for (i = 0; i < list1.length; i++) { mergedList->data[i] = list1.data[i]; } mergedList->length = list1.length; // 复制list2的元素到mergedList for (i = list1.length; i < list1.length + list2.length; i++) { mergedList->data[i] = list2.data[i - list1.length]; } mergedList->length = list1.length + list2.length; } ``` 3. 编写构建相等元素新顺序表函数,将两个顺序表中相等的元素构建成一个新的顺序表。 ```c void buildEqualList(SeqList list1, SeqList list2, SeqList *equalList) { int i, j; equalList->length = 0; for (i = 0; i < list1.length; i++) { for (j = 0; j < list2.length; j++) { if (list1.data[i] == list2.data[j]) { equalList->data[equalList->length] = list1.data[i]; equalList->length++; } } } } ``` 以上就是利用C语言编写程序,实现两个顺序表合并以及构建相等元素的新顺序表的步骤。在合并函数中,我们通过循环将两个表的元素依次复制到新的表中,最终得到一个合并后的顺序表。在构建相等元素新顺序表函数中,我们使用两个嵌套循环分别比较两个顺序表中的元素是否相等,并将相等的元素添加到新的顺序表中。 ### 回答3: 可以利用C语言编写程序实现两个顺序表合并以及将相等元素构建成新的顺序表的操作。 首先,我们需要定义顺序表数据结构。可以使用结构体来表示一个顺序表,其中包含两个成员,一个用于存储元素的数组和一个用于记录当前元素个数的变量。 ```c #define MAX_SIZE 100 typedef struct { int data[MAX_SIZE]; int length; } SeqList; ``` 接下来,我们可以编写一个函数来实现两个顺序表合并操作。这个函数接受两个顺序表作为参数,并返回合并后的顺序表。 ```c SeqList combineSeqList(SeqList list1, SeqList list2) { SeqList combinedList; combinedList.length = list1.length + list2.length; for (int i = 0; i < list1.length; i++) { combinedList.data[i] = list1.data[i]; } for (int j = 0; j < list2.length; j++) { combinedList.data[list1.length + j] = list2.data[j]; } return combinedList; } ``` 接着,我们编写另一个函数来实现将两个顺序表中相等元素构建成新的顺序表的操作。这个函数同样接受两个顺序表作为参数,并返回包含相等元素的新顺序表。 ```c SeqList getEqualElements(SeqList list1, SeqList list2) { SeqList equalList; equalList.length = 0; for (int i = 0; i < list1.length; i++) { for (int j = 0; j < list2.length; j++) { if (list1.data[i] == list2.data[j]) { equalList.data[equalList.length] = list1.data[i]; equalList.length++; break; } } } return equalList; } ``` 最后,我们可以在程序中使用这两个函数来进行操作。例如: ```c int main() { SeqList list1 = {{1, 2, 3, 4}, 4}; SeqList list2 = {{3, 4, 5, 6}, 4}; SeqList combinedList = combineSeqList(list1, list2); SeqList equalList = getEqualElements(list1, list2); // 输出合并后的顺序表 printf("Combined list: "); for (int i = 0; i < combinedList.length; i++) { printf("%d ", combinedList.data[i]); } printf("\n"); // 输出相等元素构建的新顺序表 printf("Equal list: "); for (int i = 0; i < equalList.length; i++) { printf("%d ", equalList.data[i]); } printf("\n"); return 0; } ``` 以上程序将输出: ``` Combined list: 1 2 3 4 3 4 5 6 Equal list: 3 4 ``` 这就是利用C语言编写程序实现两个顺序表合并以及将相等元素构建成新的顺序表的操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值