有學生調程式,是要建順序表。
他的程式是這樣的:
#include
#include
#define maxsize 50 //maxsize將用於後面定義儲存空間的大小
typedef
int elemtype; //elemtype在不同場合可以根據問題的需要確定,在此取簡單的int
typedef
struct
sqlist;
//宣告自定義函式
sqlist initlist(sqlist *l); //初始化順序表
void listinsert(sqlist *l,int i,int b); //插入函式
void displist(sqlist *l); //輸出函式
bool listempty(sqlist *l);//判定是否為空表listempty(l)
int main()
//輸出線性表displist(l)
void displist(sqlist *l)
//判定是否為空表listempty(l)
bool listempty(sqlist *l)
//初始化順序表initlist(*l)
sqlist initlist(sqlist *l)
void listinsert(sqlist *l,int i,int b) //插入函式
for(j=l->length; j>i; j--)
l->data[i]=b;
l->length++;
}
執行結果是這樣的:
他找我幫忙。基本可以斷定,記憶體使用不當,有溢位。
看一下編譯提示的資訊,有乙個警告:
d:\cb\ds\main.cpp|21|warning: 『sq』 is used uninitialized in this function [-wuninitialized]|
說在21行,sq未經初始化就使用了。通俗的說法,野指標。
圍繞著sq找。在main()函式中有:
sqlist *sq;
initlist(sq);
這裡在呼叫initlist時,實際引數sq就是野指標。但這還不是出問題的關鍵,看initlist函式的定義是:
//初始化順序表initlist(*l)
sqlist initlist(sqlist *l)
呼叫時,l得到的是野指標,但在函式裡為其分配空間了。但呼叫完,這個位址並未返回到main函式中。呼叫完initlist,sq仍然還是野指標。這是關鍵!
沿這個思路,希望能將分配的空間位址能返回給main函式。return *l就不合適了,return l是返回位址。於是,函式定義改為:
//初始化順序表initlist(*l)
sqlist *initlist(sqlist *l)
既然引數sqlist *l呼叫時給的是個野指標,不要也罷。於是改選成無參函式:
//初始化順序表initlist(*l)
sqlist *initlist()
在呼叫時,main函式定義為:
int main()
為保證程式能夠正確編譯,函式宣告等處的語法問題不一一列出。解決了這一環節的問題,程式能夠執行了,但結果:
斷定問題出在listinsert函式中。看呼叫,插入的位置用的是邏輯序(從1開始記數),但函式定義中,直接l->data[i]=b;沒有考慮物理儲存中,下標是從0開始的。
所以,在listinsert中加入乙個 i–,完成邏輯序號向物理序號的轉換,done。
正確的結果不貼圖了,最後改過的程式是:
#include
#include
#define maxsize 50 //maxsize將用於後面定義儲存空間的大小
typedef
int elemtype; //elemtype在不同場合可以根據問題的需要確定,在此取簡單的int
typedef
struct
sqlist;
//宣告自定義函式
sqlist *initlist(); //初始化順序表
void listinsert(sqlist *l,int i,int b); //插入函式
void displist(sqlist *l); //輸出函式
bool listempty(sqlist *l);//判定是否為空表listempty(l)
int main()
//輸出線性表displist(l)
void displist(sqlist *l)
//判定是否為空表listempty(l)
bool listempty(sqlist *l)
//初始化順序表initlist(*l)
sqlist *initlist()
void listinsert(sqlist *l,int i,int b) //插入函式
i--;
for(j=l->length; j>i; j--)
l->data[i]=b;
l->length++;
}
資料結構 順序表的初始化
include include define ok 1 define overflow 2 define maxsize 100 define list init size 10 線性表儲存空間的初始分配量 typedef int status status是函式資料型別 其值是函式結果狀態,如ok...
C 資料結構 順序表初始化及其增刪改查
include include define maxsize 20 順序表的最大長度 define n 11 using namespace std 實現順序表的初始化和增刪改查 注意 該程式預設順序表的第0個位置不用,元素從1開始存放 typedef struct sqlist 順序表初始化函式 ...
資料結構 順序表初始化時必須傳位址
順序表在進行初始化操作中必須傳位址,否則,一切都是徒勞。以下,通過畫圖的形式詳細介紹為什麼要傳位址而不能傳值 大家了解c語言的肯定知道傳值和傳址的區別,但是在學習資料結構時不得不強調傳址的重要性。傳值 圖1.17中程式執行時,先給實參 sl 分配一塊儲存空間,sl 中包括 data 100 及 nl...