user-0 提问: C语言数据结构

回复:
user: user-1
content: 引用 2 楼 qq_34668913 的回复:[quote=引用 1 楼 cfjtaishan 的回复:]  参考一下上面的代码吧；  错误主要是在main中。遇到这样的问题，比如合并，那么合并之前先确保La, Lb里面的数据没问题，然后在查看是不是合并函数里出了问题。你的代码里主要是在对La. Lb赋值时出了问题，即数据没有插入到La和Lb中。 如还有可以继续提出来。  你这样改了运行没问题。 可是一定得把数组ab改成指针么？ 还有，我没加Lb的时候，数组a是可以对La正常赋值的，为什么加了合并函数和Lb之后就不可以了呢？ [/quote] 之所以用a,b指针，因为考虑从栈上申请空间，m,n定义是没有初始化，是一个随机值；再说C语言不支持可变长度。 La和Lb是两个独立的数据结构变量，赋值也是独立，建议你对比一下代码，然后查找问题。

user: user-0
content: 好的，蟹蟹你们

user: user-2
content: 引用不可以了呢 int n,m,i;   int a[n],b[m];  //定义数组时，需要知道确定的大小。  如果所需的内存空间大小取决于实际输入的数据，而无法预先确定，这种情况下就需要动态分配内存空间。 可以参考：http://www.prglab.com/cms/pages/c-tutorial/advanced-data/dynamic-memory.php

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:参考一下上面的代码吧；  错误主要是在main中。遇到这样的问题，比如合并，那么合并之前先确保La, Lb里面的数据没问题，然后在查看是不是合并函数里出了问题。你的代码里主要是在对La. Lb赋值时出了问题，即数据没有插入到La和Lb中。 如还有可以继续提出来。  你这样改了运行没问题。 可是一定得把数组ab改成指针么？ 还有，我没加Lb的时候，数组a是可以对La正常赋值的，为什么加了合并函数和Lb之后就不可以了呢？

user: user-1
content: #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中。 如还有可以继续提出来。