程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話次序表完成代碼排錯

C說話次序表完成代碼排錯

編輯:關於C++

C說話次序表完成代碼排錯。本站提示廣大學習愛好者:(C說話次序表完成代碼排錯)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話次序表完成代碼排錯正文


明天原來想寫段代碼練練手,設法主意挺好成果,栽了個年夜跟頭,在這個毛病上彷徨了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;
}

便可以了

年夜家引認為戒.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved