栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言顺序表实现代码排错

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言顺序表实现代码排错

今天本来想写段代码练练手,想法挺好结果,栽了个大跟头,在这个错误上徘徊了4个小时才解决,现在分享出来,给大家提个醒,先贴上代码:

复制代码 代码如下:

#ifndef __SQLIST_H__
#define __DWLIST_H__

#include
#include
#include

#define MAXSIZE     50
#define OK          0
#define ERR         -1

typedef int elemtype;

typedef struct {
    elemtype data[MAXSIZE];
    int      len;
}sqlist;

int init_list(sqlist *L);
int destroy_list(sqlist *L);
int list_empty(sqlist L);
int list_length(sqlist L);
int disp_list(sqlist L);
int get_elem(sqlist L, int i, elemtype *e);
int local_elem(sqlist L, elemtype e);
int list_insert(sqlist *L, int i, elemtype e);
int list_delete(sqlist *L, int i, elemtype *e);

#endif



#include "sqlist.h"

#if 0
#define ERR_NONE_ERROR        0
#define ERR_FUNC_EXEC         1
#define ERR_FILE_OPEN         2

char *error_msg[] = {
        "成功执行,无错误",
        "函数执行错误",
        "文件打开错误",
};
int my_errno = 0;
#endif

int main(void)
{
    int ret = 0;
    int i = 0;
    sqlist slist;
    elemtype e;

    memset(&slist, 0, sizeof(slist));
    printf("length:%dn", slist.len);
    ret = init_list(&slist);
    if (OK != ret)
        return -1;

    ret = list_empty(slist);
    printf("长度:%dn", slist.len);
    if (OK == ret)
        printf("顺序表为空n");
    if (ERR == ret)
        printf("顺序表不为空n");

    for (i = 0; i < 10; i++) {
        e = (elemtype)i;
        list_insert(&slist, i, e);
    }
    printf("插入数据n");

    ret = list_empty(slist);
    if (OK == ret)
        printf("顺序表为空n");
    if (ERR == ret)
        printf("顺序表不为空n");

    printf("after length%dn", list_length(slist));

    disp_list(slist);

    destroy_list(&slist);

    return 0;
}


int init_list(sqlist *L)
{
    L = (sqlist *)malloc(sizeof(sqlist));

    if (NULL == L) {
        L = NULL;
        return -1;
    }

    L->len = 0;

    return 0;
}


int destroy_list(sqlist *L)
{
    free(L);

    return 0;
}


int list_empty(sqlist L)
{
    if (0 == L.len)
        return 0;

    return -1;
}


int list_length(sqlist L)
{
    return L.len;
}


int disp_list(sqlist L)
{
    int i = 0;

    if (0 >= L.len)
        return -1;

    for (i = 0; i < L.len; i++)
        printf("%dt", L.data[i]);
   
    printf("n");

    return 0;
}


int get_elem(sqlist L, int i, elemtype *e)
{
    if (i < 0 || i >= L.len) {
        e = NULL;
        return -1;
    }

    *e = L.data[i];
   

    return 0;
}


int local_elem(sqlist L, elemtype e)
{
    int i = 0;

    for (i = 0; i < L.len; i++) {
        if (e == L.data[i])
            return i;
    }

    return -1;
}


int list_insert(sqlist *L, int i, elemtype e)
{
    int j = 0;

    if (i < 0 || i > MAXSIZE-1)
        return -1;

    for (j = L->len; j > i; j--)
        L->data[j] = L->data[j-1];

    L->data[i] = e;
    L->len++;

    return 0;
}


int list_delete(sqlist *L, int i, elemtype *e)
{
    int j = 0;

    if (i < 0 || i >=L->len)
        return -1;

    *e = L->data[i];
    for (j = i; j < (L->len-1); j++)
        L->data[j] = L->data[j+1];

    L->len--;

    return 0;
}

很自得,自认为写的很好,运行一下看看,

结果完全出乎意料.

好吧!现在分析错误!

看看main中的定义复制代码 代码如下:
int ret = 0;
   int i = 0;
   sqlist slist;
   elemtype e;


看看初始化函数init_list

复制代码 代码如下:
int init_list(sqlist *L)
{
   L = (sqlist *)malloc(sizeof(sqlist));

    if (NULL == L) {
        L = NULL;
        return -1;
    }

    L->len = 0;

    return 0;
}

相信聪明的你已经看出来了,我在main中定义的slist空间在栈上,而我在init_list中一下子将这个东东分配到了堆空间,并且slist并不是指针,根本无法进行指向,所以结果当然就非常的错误了.

打个比方,栈和堆是两个平行的世界,只有指针是穿梭于两个世界的虫洞,除此以为其他东西无法进行跨越.

知道了原因自然很容易解决了.

由于栈上会自动分配空间所以就无需再次申请空间.所以init_list改为:

复制代码 代码如下:
int init_list(sqlist *L)
{
   
    L->len = 0;

    return 0;
}

就可以了

大家引以为戒.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/65969.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号