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;
}
便可以了
年夜家引認為戒.