69,368
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
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) exit(OVERFLOW);
L->length =0;
L->listsize = LIST_INIT_SIZE;
return OK;
}
int DestoryList(SqList *L)
{
if(!L->elem) return ERROR;
free(L->elem);
return OK;
}
int ListInsert(SqList *L,int i,int e)
{
//在顺序线性表L中第i个位置之前插入新元素e
//i的合法值为1<=i<=listlength(L)
int j;
if(i<1||i>(L->length)) return ERROR; //i值不合法
int *newbase;
int p;
if((L->length)>=(L->listsize)) //当前空间已满,增加分配
{
newbase = (int*)realloc(L->elem,(L->listsize+LIST_INIT_SIZE)*sizeof(int));
if(!newbase) exit(OVERFLOW);//存储分配失败
L->elem = newbase;//新基址
L->listsize += LISTINCREMENT;//增加存储容量
}
for(p=(L->length)-1;p>=i-1;--p)
{
L->elem[p+1] = L->elem[p];//插入位置及之后的元素右移
}
L->elem[p+1] = e;//插入e
++(L->length);
return OK;
}
int ListDelete(SqList *L,int i,int e){
//在顺序线性表L中删除第i个元素,并用e返回其值
//i的合法值为1<=i<=listlength(L)
if(i<1||i>L->length) return ERROR; //i值不合法
int p,q;
e = L->elem[i-1];//p为被删除的元素
q = *(L->elem)+(L->length)-1;//表尾元素的位置
for(p=i-1;p<=q;p++)
L->elem[p] = L->elem[p+1]; //被删除的元素之后的元素左移
--L->length;
return OK;
}
//找出元素的位序
int LocateElem(SqList L,int e,int (*compare)(int,int)){
//在顺序线性表中L中查找第一个与e满足compare()的元素的位序
int i=1;
int *p;
p=L.elem;
while(i<=L.length&&!(*compare)(*p++,e))
++i;
if(i<=L.length)
return i;
else
return 0;
}
int compare(int e1,int e2)
{
if(e1==e2)
return true;
return false;
}
//根据位序找元素
int GetElem(SqList *L,int i,int *e){
//用e返回L中第i个元素的值
int k;
for(k=0;k<(L->listsize);k++)
{
if(k==i-1)
{
*e=L->elem[k];
}
}
return *e;
}
int ListLength(SqList *L){
return L->length;
}
void Union(SqList *La, SqList Lb) {
// 将所有在线性表Lb中但不在La中的数据元素插入到La中
int La_len,Lb_len,i,e;
La_len = ListLength(La); // 求线性表的长度
Lb_len = ListLength(&Lb);
for (i=1; i<=Lb_len; i++) {
GetElem(&Lb, i, &e); // 取Lb中第i个数据元素赋给e
if (!LocateElem(*La, e, (*compare))) // La中不存在和e相同的数据元素
ListInsert(La, ++La_len, e); // 插入
}
}
int main()
{
SqList La,Lb;
int n,m,i;
int a[n],b[m];
//列表初始化
InitList(&La);
InitList(&Lb);
//列表La输入元素
printf("\n请输入您要输入的元素的个数:");
scanf("%d",&n);
printf("\n请输入这 %d 个元素:",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
//列表Lb输入元素
printf("\n请输入您要输入的元素的个数:");
scanf("%d",&m);
printf("\n请输入这 %d 个元素:",m);
for(i=0;i<m;i++)
{
scanf("%d",&b[i]);
}
//列表La赋值
printf("\n您输入的列表La为:");
for(i=0;i<La.length;i++)
{
La.elem[i] = a[i];
++La.length;
printf("%d\t",La.elem[i]);
}
printf("\n您输入的列表Lb为:");
for(i=0;i<Lb.length;i++)
{
Lb.elem[i] = b[i];
++Lb.length;
printf("%d\t",Lb.elem[i]);
}
//合并
Union(&La,Lb);
printf("\n合并后的La为:");
for(i=0;i<10;i++)
{
printf("%d\t",La.elem[i]);
}
DestoryList(&La);
DestoryList(&Lb);
printf("\nover.");
}
int n,m,i;
int a[n],b[m]; //定义数组时,需要知道确定的大小。
如果所需的内存空间大小取决于实际输入的数据,而无法预先确定,这种情况下就需要动态分配内存空间。
可以参考:http://www.prglab.com/cms/pages/c-tutorial/advanced-data/dynamic-memory.php
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
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)
exit(OVERFLOW);
L->length =0;
L->listsize = LIST_INIT_SIZE;
return OK;
}
int DestoryList(SqList *L)
{
if(!L->elem)
return ERROR;
free(L->elem);
return OK;
}
int ListInsert(SqList *L,int i,int e)
{
//在顺序线性表L中第i个位置之前插入新元素e
//i的合法值为1<=i<=listlength(L)
int j;
int *newbase;
if(i < 1 || i > (L->listsize))
return ERROR; //i值不合法
if((L->length)>=(L->listsize)) //当前空间已满,增加分配
{
newbase = (int*)realloc(L->elem,(L->listsize+LIST_INIT_SIZE)*sizeof(int));
if(!newbase)
exit(OVERFLOW);//存储分配失败
L->elem = newbase;//新基址
L->listsize += LISTINCREMENT;//增加存储容量
}
for(j = (L->length)-1; j >= i-1; --j) {
L->elem[j+1] = L->elem[j];//插入位置及之后的元素右移
}
L->elem[j+1] = e;//插入e
++(L->length);
return OK;
}
int ListDelete(SqList *L,int i,int e){
//在顺序线性表L中删除第i个元素,并用e返回其值
//i的合法值为1<=i<=listlength(L)
if(i<1||i>L->length) return ERROR; //i值不合法
int p,q;
e = L->elem[i-1];//p为被删除的元素
q = *(L->elem)+(L->length)-1;//表尾元素的位置
for(p=i-1;p<=q;p++)
L->elem[p] = L->elem[p+1]; //被删除的元素之后的元素左移
--L->length;
return OK;
}
//找出元素的位序
int LocateElem(SqList L,int e,int (*compare)(int,int))
{
//在顺序线性表中L中查找第一个与e满足compare()的元素的位序
int i=1;
int *p;
p = L.elem;
while(i <= L.length && !(*compare)(*p++,e))
++i;
if(i <= L.length)
return i;
else
return 0;
}
int compare(int e1,int e2)
{
if(e1==e2)
return true;
return false;
}
//根据位序找元素
int GetElem(SqList *L,int i,int *e){
//用e返回L中第i个元素的值
int k;
for(k=0;k<(L->listsize);k++)
{
if(k==i-1)
{
*e=L->elem[k];
}
}
return *e;
}
int ListLength(SqList *L)
{
return L->length;
}
void Union(SqList *La, SqList Lb)
{
// 将所有在线性表Lb中但不在La中的数据元素插入到La中
int La_len,Lb_len,i,e;
La_len = ListLength(La); // 求线性表的长度
Lb_len = ListLength(&Lb);
for (i=1; i<=Lb_len; i++) {
GetElem(&Lb, i, &e); // 取Lb中第i个数据元素赋给e
if (!LocateElem(*La, e, (*compare))) // La中不存在和e相同的数据元素
ListInsert(La, ++La_len, e); // 插入
}
}
int main()
{
SqList La,Lb;
int n,m,i;
int *a, *b;
//列表初始化
InitList(&La);
InitList(&Lb);
//列表La输入元素
printf("\n请输入您要输入的元素的个数:");
scanf("%d",&n);
a = (int *)malloc(sizeof(int) * n);
printf("\n请输入这 %d 个元素:",n);
for(i=0;i<n;i++)
{
scanf("%d", &a[i]);
}
//列表Lb输入元素
printf("\n请输入您要输入的元素的个数:");
scanf("%d", &m);
b = (int *)malloc(sizeof(int) * m);
printf("\n请输入这 %d 个元素:",m);
for(i=0; i < m; i++)
{
scanf("%d", &b[i]);
}
//列表La赋值
printf("\n您输入的列表La为:");
for(i=0;i < n;i++)
{
La.elem[i] = a[i];
++La.length;
//ListInsert(&La, i+1, a[i]);
printf("%d\t", La.elem[i]);
}
printf("\n您输入的列表Lb为:");
for(i = 0; i < m; i++)
{
Lb.elem[i] = b[i];
++Lb.length;
//ListInsert(&Lb, i+1, b[i]);
printf("%d\t",Lb.elem[i]);
}
printf("\n");
//合并
Union(&La,Lb);
printf("La's length = %d\n", La.length);
printf("\n合并后的La为:");
for(i = 0; i < La.length;i++)
{
printf("%d\t",La.elem[i]);
}
DestoryList(&La);
DestoryList(&Lb);
printf("\nover.");
}
参考一下上面的代码吧;
错误主要是在main中。遇到这样的问题,比如合并,那么合并之前先确保La, Lb里面的数据没问题,然后在查看是不是合并函数里出了问题。你的代码里主要是在对La. Lb赋值时出了问题,即数据没有插入到La和Lb中。
如还有可以继续提出来。