C语言数据结构

qq_34668913 2017-07-27 08:39:54
#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.");
}


不加Union函数和Lb数组是可以正常运行的;
现在运行报错
InitList(&La);//此行:bus error
编译的时候没有出现错误,所以改错不知道如何下手,有没有知道要怎么debug网友,蟹蟹了...
...全文
148 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2017-07-28
  • 打赏
  • 举报
回复
引用 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是两个独立的数据结构变量,赋值也是独立,建议你对比一下代码,然后查找问题。
qq_34668913 2017-07-28
  • 打赏
  • 举报
回复
好的,蟹蟹你们
战在春秋 2017-07-28
  • 打赏
  • 举报
回复
引用
不可以了呢
int n,m,i;  
int a[n],b[m];  //定义数组时,需要知道确定的大小。
如果所需的内存空间大小取决于实际输入的数据,而无法预先确定,这种情况下就需要动态分配内存空间。 可以参考:http://www.prglab.com/cms/pages/c-tutorial/advanced-data/dynamic-memory.php
qq_34668913 2017-07-27
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
参考一下上面的代码吧; 错误主要是在main中。遇到这样的问题,比如合并,那么合并之前先确保La, Lb里面的数据没问题,然后在查看是不是合并函数里出了问题。你的代码里主要是在对La. Lb赋值时出了问题,即数据没有插入到La和Lb中。 如还有可以继续提出来。
你这样改了运行没问题。 可是一定得把数组ab改成指针么? 还有,我没加Lb的时候,数组a是可以对La正常赋值的,为什么加了合并函数和Lb之后就不可以了呢?
自信男孩 2017-07-27
  • 打赏
  • 举报
回复
#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中。 如还有可以继续提出来。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧