|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50
typedef struct
{
int date[MaxSize];
int length;
} Sqlist;
void CreatList(Sqlist *s)
{
int n, len, i;
scanf("%d", &n);
for (i = 0; n != -1; i++)
{
s->date[i] = n;
len++;
scanf("%d", &n);
}
s->length = len;
}
void UnionList(Sqlist *LA, Sqlist *LB, Sqlist *&LC)
{
int i = 0, j = 0, k = 0;
LC = (Sqlist *)malloc(sizeof(Sqlist));
while (i < LA->length && i < LB->length)
{
if (LA->date[i] < LB->date[i])
{
LC->date[k] = LA->date[i];
i++;
k++;
}
else
{
LC->date[k] = LB->date[j];
}
}
while (i < LA->length)
{
LC->date[k] = LA->date[i];
i++;
k++;
}
while (j < LB->length)
{
LC->date[k] = LB->date[j];
j++;
k++;
}
LC->length = k;
}
void print(Sqlist *L)
{
int i;
if (L->length == 0)
return;
for (i = 0; i < L->length; i++)
{
printf("%d ", L->date[i]);
}
printf("\n");
}
int main()
{
Sqlist LA, LB, LC;
CreatList(&LA);
CreatList(&LB);
print(&LA);
print(&LB);
UnionList(&LA,&LB,&LC); //此处报错 报错信息:非常量引用的初始值必须为左值
print(&LC);
return 0;
}
本帖最后由 桃花飞舞 于 2022-9-19 16:39 编辑
我百度了一个C语言的代码,可以解决(a)这个问题,不过它的代码有无序表部分。(b)这个问题用数组我可以解。链表我也没做过。
- #include<stdio.h>
- #include<stdlib.h>
-
- #define OK 1
- #define OVERFLOW 0
- #define LIST_INIT_SIZE 10
- #define LISTINCREMENT 5
-
- typedef struct{
- int *elem;
- int length;
- int listsize;
- }Sqlist;
-
- //初始化顺序表
- int InitList(Sqlist *l){
- l->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
- if(!l->elem){
- printf("存储空间分配失败!\n");
- exit(OVERFLOW);
- }
- l->length = 0;
- l->listsize = LIST_INIT_SIZE;
- return OK;
- }
- //给顺序表赋值
- int CreatList(Sqlist *l,int length){
- printf("请输入元素:\n");
- for(int i=0;i<length;i++) scanf("%d",l->elem+i);
- l->length = length;
- return OK;
- }
- //输出顺序表中的元素
- void PrintList(Sqlist *l){
- printf("输出结果为:\n");
- for(int i=0;i<l->length;i++) printf("%d ",l->elem[i]);
- printf("\n");
- }
-
- //得到线性表某位置上的元素
- int GetElem(Sqlist *l,int i,int *p){
- if(i<1||i>l->length){
- printf("位置错误!\n");
- exit(OVERFLOW);
- }
- *p = l->elem[i-1];
- return OK;
- }
-
- int ListInsert(Sqlist *l,int i,int e){//i是第几个
- if(i<1||i>l->length+1){
- printf("插入位置有误!\n");
- exit(OVERFLOW);
- }
- if(l->length==l->listsize){
- int *newbase;
- newbase = (int *)realloc(l->elem,(l->listsize+LISTINCREMENT)*sizeof(int));
- if(!newbase){
- printf("存储空间分配失败!\n");
- exit(OVERFLOW);
- }
- l->elem = newbase;
- l->listsize += LISTINCREMENT;
- }
- l->elem[i-1] = e;
- l->length++;
- return OK;
- }
-
- //是否需要增加分配空间
- int IncreaseList(Sqlist *l,int length){
- if(length>l->listsize){
- int *newbase;
- newbase = (int *)realloc(l->elem,(l->listsize+LISTINCREMENT)*sizeof(int));
- if(!newbase){
- printf("存储空间分配失败!\n");
- exit(OVERFLOW);
- }
- l->elem = newbase;
- l->listsize += LISTINCREMENT;
- }
- return OK;
- }
-
- //将两个无序顺序表连接起来
- int UnionWx(Sqlist *a,Sqlist b){
- int a_length = a->length,b_length = b.length;
- for(int i=0;i<b_length;i++){//这里的i是下标 GetElem()里的i是位置
- int num,flag = 0;
- GetElem(&b,i+1,&num);
- for(int j=0;j<a_length;j++){
- if(num==a->elem[j]) {
- flag = 1;//在a顺序表里找到了相同的元素
- break;
- }
- }
- if(!flag) ListInsert(a,++a_length,num);
- }
- return OK;
- }
-
- //将两个有序顺序表连接起来
- int UnionYx(Sqlist *a,Sqlist *b,Sqlist *c){
- int *pa,*pb,*pc,*pa_last,*pb_last;
-
- pa = a->elem; pb = b->elem; pa_last = pa+a->length-1; pb_last = pb+b->length-1;
- c->length = a->length+b->length;//C顺序表示要存储a b两个表中的数据的 所以存储空间应该是二者的和 由此来申请C的存储空间
- c->listsize = c->length;
-
- c->elem = (int *)malloc(c->listsize*sizeof(int));
- if(!c->elem){
- printf("合并后的顺序表申请内存失败!\n");
- exit(OVERFLOW);
- }
- pc = c->elem;
-
- while(pa<=pa_last&&pb<=pb_last){//归并
- if(*pa<=*pb){
- *pc++ = *pa++;
- }
- else{
- *pc++ = *pb++;
- }
- }
-
- while(pa<=pa_last) *pc++ = *pa++;//插入顺序表a剩下的元素
- while(pb<=pb_last) *pc++ = *pb++;//插入顺序表b剩下的元素
-
- return OK;
- }
-
-
- main(){
- int a_length,b_length;
- Sqlist a,b,c;
-
- InitList(&a);
- printf("第一个顺序表你想输入多少个元素?\n");
- scanf("%d",&a_length);
- IncreaseList(&a,a_length);//是否需要增加分配空间
- CreatList(&a,a_length);
- PrintList(&a);
-
- InitList(&b);
- printf("\n第二个顺序表你想输入多少个元素?\n");
- scanf("%d",&b_length);
- IncreaseList(&b,b_length);//是否需要增加分配空间
- CreatList(&b,b_length);
- PrintList(&b);
- printf("合并后");
- //无序顺序表的合并
- UnionWx(&a,b);
- PrintList(&a);
- //有序线性表的合并
- // UnionYx(&a,&b,&c);
- // PrintList(&c);
- }
复制代码
|
|