亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言順序表實現代碼排錯

2020-01-26 15:40:26
字體:
來源:轉載
供稿:網友

今天本來想寫段代碼練練手,想法挺好結果,栽了個大跟頭,在這個錯誤上徘徊了4個小時才解決,現在分享出來,給大家提個醒,先貼上代碼:

復制代碼 代碼如下:

/********************************************
 * 文件名稱:sqlist.h
 * 文件描述:線性表順序存儲演示
 * 文件作者:by Wang.J,in 2013.11.16
 * 文件版本:1.0
 * 修改記錄:
*********************************************/
#ifndef __SQLIST_H__
#define __DWLIST_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#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


/**************************************************
 * 文件名稱:sqlist.c
 * 文件描述:線性表順序存儲的實現
 * 文件作者:by Wang.J,in 2013.11.16
 * 文件版本:1.0
 * 修改記錄:
***************************************************/
#include "sqlist.h"

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

char *error_msg[] = {
    /* 0  */    "成功執行,無錯誤",
    /* 1  */    "函數執行錯誤",
    /* 2  */    "文件打開錯誤",
};
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:%d/n", slist.len);
    ret = init_list(&slist);
    if (OK != ret)
        return -1;

    ret = list_empty(slist);
    printf("長度:%d/n", 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%d/n", list_length(slist));

    disp_list(slist);

    destroy_list(&slist);

    return 0;
}

/*=====================================================
 * 函數名稱:init_list
 * 函數功能:初始化一個順序表,創建一個空的順序表
 * 函數參數:sqlist *L   負責返回一個創建好的順序表,如果創建
            失敗則返回NULL
 * 返 回 值:成功返回0并通過指針返回一個創建好的空表
            失敗返回-1指針返回NULL
 * 創 建 人:by Wang.J,in 2013.11.16
 * 修改記錄:
======================================================*/
int init_list(sqlist *L)
{
    L = (sqlist *)malloc(sizeof(sqlist));

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

    L->len = 0;

    return 0;
}

/*=====================================================
 * 函數名稱:destroy_list
 * 函數功能:銷毀創建好的順序表,釋放順序表的空間
 * 函數參數:sqlist *L,已經存在的線性表
 * 返 回 值:成功     0
            失敗     -1
            通常free不會失敗,其實這個函數可以直接使用void
            的,這里只是自己順手寫的,看到代碼就知道不會返回0
 * 創 建 人:by Wang.J,in 2013.11.16
 * 修改記錄:
======================================================*/
int destroy_list(sqlist *L)
{
    free(L);

    return 0;
}

/*=====================================================
 * 函數名稱:list_empty
 * 函數功能:判斷sqlist順序表是否為空
 * 函數參數:sqlist L,已存在的線性表
 * 返 回 值:空     0
            不空   -1
 * 創 建 人:by Wang.J,in 2013.11.16
 * 修改記錄:
======================================================*/
int list_empty(sqlist L)
{
    if (0 == L.len)
        return 0;

    return -1;
}

/*=====================================================
 * 函數名稱:list_length
 * 函數功能:取得線性表的長度,返回順序表中元素個數
 * 函數參數:sqlist L,已經存在的線性表
 * 返 回 值:L的長度
 * 創 建 人:by Wang.J,in 2013.11.16
 * 修改記錄:
======================================================*/
int list_length(sqlist L)
{
    return L.len;
}

/*=====================================================
 * 函數名稱:disp_list
 * 函數功能:顯示順序表中所有的元素
 * 函數參數:sqlist L,已經存在的線性表
 * 返 回 值:成功     0
            失敗     -1
 * 創 建 人:by Wang.J,in 2013.11.16
 * 修改記錄:
======================================================*/
int disp_list(sqlist L)
{
    int i = 0;

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

    for (i = 0; i < L.len; i++)
        printf("%d/t", L.data[i]);
    /*
     * 這個地方我自己是有異議的,首先你可能不知道輸出的類型為
     * %d,再就是求長度是使用list_length函數還是使用L.len方式,
     * list_length是函數調用有著函數調用的額外開銷,在PC上這點
     * 開銷不算什么,但是在嵌入式系統就不得不考慮這種開銷了,
     * 這基本上算是良好的移植性和代碼效率之間的問題,為了提高
     * 移植性可以多添加幾層抽象層,實現各種判斷.除非是極其龐大
     * 的項目或是為了匹配各種這樣的設備,我認為像代碼定義類型這
     * 種小事,團隊溝通就能解決.工作是避免問題,學習是自找問題.
     * 所以怎么取舍只能看個人了.
    */
    printf("/n");

    return 0;
}

/*=====================================================
 * 函數名稱:get_elem
 * 函數功能:獲取i位置元素的值域,為了方便對應i從0開始與
            數組下標一致,用e返回獲取的值
 * 函數參數:sqlite L    存在的順序表
            int    i    位置
            elemtype *e 返回值域
 * 返 回 值:成功     0
            失敗     -1
 * 創 建 人:by Wang.J,in 2013.11.16
 * 修改記錄:
======================================================*/
int get_elem(sqlist L, int i, elemtype *e)
{
    if (i < 0 || i >= L.len) {
        e = NULL;
        return -1;
    }

    *e = L.data[i];
    /*
     * 這個地方要注意
     * 看看與e = &(L.data[i])區別
    */

    return 0;
}

/*=====================================================
 * 函數名稱:local_elem
 * 函數功能:按元素值查找,返回第一個與e相匹配的元素位置
 * 函數參數:sqlist L,已經存在的順序表
 * 返 回 值:存在返回位置
            失敗返回-1
 * 創 建 人:by Wang.J,in 2013.11.16
 * 修改記錄:
======================================================*/
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;
}

/*=====================================================
 * 函數名稱:list_insert
 * 函數功能:在sqlite的i位置插入元素
 * 函數參數:sqlist *L   已存在的順序表
            int     i   位置
            elemtype e  元素
 * 返 回 值:成功   0
            失敗   -1
 * 創 建 人:by Wang.J,in 2013.11.16
 * 修改記錄:
======================================================*/
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;
}

/*=====================================================
 * 函數名稱:list_delete
 * 函數功能:刪除i位置的元素,元素通過e返回
 * 函數參數:sqlite  *L  已存在的順序表
            int      i  位置
            elemtype *e 刪除位置的元素
 * 返 回 值:成功    0
            失敗    -1
 * 創 建 人:by Wang.J,in 2013.11.16
 * 修改記錄:
======================================================*/
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 = (sqlist *)malloc(sizeof(sqlist));

    if (NULL == L) {
        L = NULL;
        return -1;
    }
    */
    L->len = 0;

    return 0;
}

就可以了

大家引以為戒.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
岛国视频午夜一区免费在线观看| 国产精品久久久久久亚洲调教| 国产一区二区三区中文| 亚洲天堂第二页| 欧美激情三级免费| 日韩大陆毛片av| 国产精品自拍偷拍视频| 狠狠色噜噜狠狠狠狠97| 亚洲综合中文字幕在线| 国产精品一区二区久久| 亚洲综合色av| 欧美成人精品在线播放| 欧美成人午夜影院| 精品视频偷偷看在线观看| 色妞久久福利网| 久久久久久久亚洲精品| 国产一区二区色| 欧美午夜无遮挡| 国产精品美女www爽爽爽视频| 午夜精品久久久久久久99热浪潮| 国产suv精品一区二区三区88区| 亚洲一区二区久久久| 亚洲第一偷拍网| 久久久91精品国产| 国产不卡av在线免费观看| 亚洲精品成人久久电影| 亚洲iv一区二区三区| 色黄久久久久久| 亚洲成人激情小说| 成人黄在线观看| 亚洲国产欧美一区二区三区久久| 国产欧美久久久久久| 岛国av一区二区| 欧美区在线播放| 96精品久久久久中文字幕| 亚洲最新在线视频| 欧美视频专区一二在线观看| 国产精品久久久久久久久久久久| 欧美在线一区二区视频| 久久综合久久美利坚合众国| 亚洲色图狂野欧美| 欧美插天视频在线播放| 国产精品久久久久久久久免费| 国产精品欧美风情| 亚洲成人av中文字幕| 亚洲人成网站色ww在线| 欧美视频第一页| 亚洲久久久久久久久久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 色综合久久久久久中文网| 少妇精69xxtheporn| 亚洲欧美视频在线| 色七七影院综合| 亚洲欧美色图片| 国产精品白嫩初高中害羞小美女| 国产91色在线|免| 奇门遁甲1982国语版免费观看高清| 亚洲福利在线观看| 91精品啪在线观看麻豆免费| 久久人91精品久久久久久不卡| 精品色蜜蜜精品视频在线观看| 欧美视频裸体精品| 欧美在线视频免费| 欧美日韩亚洲系列| 国产亚洲欧美日韩一区二区| 欧美精品videosex性欧美| 最近中文字幕2019免费| 亚洲国产精品人人爽夜夜爽| 亚洲图片在线综合| 国产午夜精品全部视频播放| 影音先锋欧美在线资源| 久久影视电视剧免费网站| 欧美日韩aaaa| 中文字幕精品一区二区精品| 57pao国产精品一区| 国产婷婷97碰碰久久人人蜜臀| 欧美在线国产精品| 久久成人精品一区二区三区| 精品欧美国产一区二区三区| 97成人精品视频在线观看| 欧美大尺度激情区在线播放| 91在线免费网站| 91精品久久久久久久久中文字幕| 久久777国产线看观看精品| 日韩在线视频观看| 国产69精品99久久久久久宅男| 日韩黄在线观看| 久久久精品美女| 色妞一区二区三区| 都市激情亚洲色图| 亚洲欧美三级伦理| 不卡伊人av在线播放| 国内精品视频一区| 正在播放欧美视频| 91精品中文在线| 欧美裸体男粗大视频在线观看| 成人春色激情网| 91精品在线观| 伊人成人开心激情综合网| 欧美电影免费看| 久久欧美在线电影| 最新中文字幕亚洲| 国产精品久久色| 国产精品日日做人人爱| 国产精品福利在线观看| 日韩电影免费观看中文字幕| 亚洲女在线观看| 欧美午夜精品久久久久久人妖| 91在线观看免费高清| 国产va免费精品高清在线观看| 成人久久一区二区三区| 韩国国内大量揄拍精品视频| 国产日产亚洲精品| 性色av一区二区咪爱| 国产不卡精品视男人的天堂| 97视频在线观看免费高清完整版在线观看| 91国语精品自产拍在线观看性色| 欧美激情精品久久久久久免费印度| 久久精品成人一区二区三区| 久久久免费av| 久久6免费高清热精品| 国产精品视频xxx| 亚洲经典中文字幕| 欧美日韩电影在线观看| 国产一区二区在线播放| 一区二区三区天堂av| 欧美日韩国产成人| 欧美电影电视剧在线观看| 精品视频久久久久久| 91精品国产高清久久久久久| 亚洲人成亚洲人成在线观看| 另类天堂视频在线观看| 国产午夜精品麻豆| 欧美成人精品不卡视频在线观看| 国产丝袜一区视频在线观看| 国产激情久久久| 亚洲xxxx在线| 欧洲精品久久久| 欧美成人午夜视频| 日本一区二区三区四区视频| 成人免费观看a| 色综合久久悠悠| 久久影院模特热| 国产美女精品视频免费观看| 日韩av免费观影| 亚洲激情国产精品| 亚洲二区在线播放视频| 欧美性猛交xxxx富婆弯腰| 亚洲自拍偷拍色片视频| 成人在线播放av| 精品亚洲夜色av98在线观看| 国产精品丝袜白浆摸在线| 亚洲国产精品成人av| 日韩av在线一区二区| 欧美激情按摩在线| 亚洲另类xxxx| 欧美激情亚洲自拍| 国产精品一区二区三区久久久| 欧亚精品在线观看| 久久99国产精品久久久久久久久| 精品无人国产偷自产在线| 成人激情春色网| 911国产网站尤物在线观看| 久久免费精品日本久久中文字幕|