資料結構C語言實現 線性鍊錶

2021-06-23 05:11:50 字數 2829 閱讀 1935

declaration.h

#ifndef declaration_h_included

#define declaration_h_included

#define true 1

#define false 0

#define ok 1

#define error 0

#define infeasible -1

#define overflow -2

#define elemtype int

typedef elemtype* triplet;

typedef int status;

typedef struct lnode

lnode, *linklist;

#endif // declaration_h_included

function.h

#ifndef function_h_included

#define function_h_included

void createlist_l(linklist *l, int n);

//逆序輸入n個元素的值,簡歷帶頭結點的單鏈表l

status listinsert_l(linklist *l , int i, elemtype e);

//在帶頭結點的單鏈線性表中第i個位置前插入元素e

status listdelete_l(linklist *l, int i, elemtype e);

//在帶頭結點的單鏈線性表中,刪除第i個元素並由e返回其值

status getelem_l(linklist l, int i, elemtype *e);

//l為帶頭結點的單鏈表的頭指標

//當第i個元素存在時將其值付給e並返回ok,否則返回error

status mergelist_l(linklist *la, linklist *lb, linklist *lc);

//歸併la和lb表到lc並按非遞減序列排列

void printlist_l(linklist l);

//輸出單鏈表中的內容

#endif // function_h_included

function.c

#include #include #include "declaration.h"

void createlist_l(linklist *l, int n)

}//createlist_l

status listinsert_l(linklist *l , int i, elemtype e)

if(!p || j >i-1) return error; //i小於1或大於表長加1

s=(linklist)malloc(sizeof(lnode));

s->data=e;

s->next=p->next;

p->next=s; //先連線後插入

return ok;

}status listdelete_l(linklist *l, int i, elemtype *e)

if( !(p->next) || j > i-1) return error;//刪除位置不合理

q=p->next; p->next=q->next;

*e=q->data;

free(q);

return *e;

}status getelem_l(linklist l, int i, elemtype *e)

if( !p || j>i) return error; //第i個元素不存在

*e=p->data;

return *e;

}//getelem_l()

status mergelist_l(linklist *la, linklist *lb, linklist *lc)

else

}while( pa )

while( pb)

return ok;

}//mergelist_l()

void printlist_l(linklist l)

main.c

#include #include #include "declaration.h"

#include "function.h"

int main()

else

printf("merget failed");

return 0;

}

分別定義二級指標la,lb,lc,將它們作為引數傳遞到createlist_l()函式中,這樣我們就可以在區域性的函式裡面為

*la, *lb, *lc分配儲存空間,這些空間在結束函式呼叫時是不會消失的。c語言中引數傳遞都是值傳遞的方式:若以變數的值作為形參,傳入的是乙份值的拷貝。函式無返回型別時,對變數值得改變僅在該呼叫函式內有效;若以指標或陣列名坐形參,傳遞的是變數的位址,同樣的在呼叫函式內對這個位址的改變不會擴散到這個函式外,但對這個位址所代表的記憶體空間進行賦值,這種改變是永久的,結束呼叫時也不會被釋放。

在實現mergelist_l(linklist *la, linklist *lb, linklist *lc)時,一開始忘記為*lc分配位址空間,使pc成為野指標,結果執行時程式一直掛掉浪費了好長一段時間。切記指標使用時一定要初始化。

執行結果:

資料結構 線性鍊錶的c語言實現

鍊錶實現的邏輯分析 為了實現業務結點的靈活定義,我們需要定義單獨定義鍊錶結點來實現鍊錶的串接與查詢,而要讓業務結點包含鍊錶結點,以實現通過鍊錶結點將業務結點串接起來。而為了實現業務結點與鍊錶結點的位址統一,我們在定義業務結點時要將鍊錶結點包含在頭部,以實現目的。示意圖如下圖所示。鍊錶結點定義 typ...

資料結構 線性表(C語言實現)

一.線性表 1 定義 是由同一型別的資料元素構成的有序序列的線性結構。2 儲存實現 順序儲存,鏈式儲存 順序儲存的優點 儲存密度大,由於用的是陣列不需要儲存位址。順序儲存的缺點 對順序表插入刪除時需要移動資料元素來實現,影響執行效率 鏈式儲存的優點 對線性表的插入刪除不需要移動資料元素,只需要修改鏈...

資料結構線性表C語言實現

include include define true 1 define false 0 define ok 1 define error 0 define infeasible 1 define overflow 2 define initsize 100 typedef int status t...