線性表之順序儲存結構與鏈式儲存結構

2022-02-11 02:42:01 字數 3987 閱讀 1883

#include #define maxsize 20

#define ok 1

#define error 0

#define true 1

#define false 0

typedef int status;//status是函式的型別

typedef int elemtype;//elemtype應根據實際型別而定

typedef struct

sqlist;

//以下函式中的parameter i都是元素的位置,不是下標,下標數值是i - 1

//獲得元素操作

status getelem(sqlist l, int i, elemtype* e)

int main()

; l.length = 6;

getelem(l, 2, e);

printf("%d", *e);

getchar();

return 0;

}//輸出結果:2

注意: 為什麼插入操作的函式定義形參與獲得元素操作不同呢?

因為如果需要獲得元素,使用指向elemtype型別的指標傳參即可

但進行插入操作時,如果使用了sqlist l,當l在主函式被呼叫時,實際上並未執行插入的操作,即插入的操作只短暫的存在於這個函式的作用域內,因此應該使用指標sqlist *l來傳參

//插入操作

status listinsert(sqlist* l, int i, elemtype e)

} l->data[i - 1] = e;

l->length++;

return ok;

}int main()

; l.length = 6;

sqlist* l = &l;

listinsert(l, 3, k);

printf("%d", l->data[2]);

getchar();

return 0;

}//輸出結果:3

//刪除操作

status listdelete(sqlist* l, int i, elemtype* e)

} l->length--;

return ok;

}int main()

; l.length = 6;

sqlist* l = &l;

listdelete(l, 3, e);

printf("%d", *e);

getchar();

return 0;

}//輸出被刪除的元素4

最好的情況:插入最後乙個位置,或者刪除最後乙個元素

形象的解釋:如同來了乙個人來排隊,自然排在最後,如果不想排了,自己乙個人離開,不影響任何人

最壞的情況:如果要插入到第乙個元素或者刪除第乙個元素

相當於所有人都要向後或者向前移動乙個身位,時間複雜度是o(n)

平均的情況:元素插入到第i個位置,或刪除第i個元素

此情況需要移動n - 1個元素,根據概率原理,最終移動次數和最中間的元素移動次數相等,為n - (1 + n) / 2, 即(n - 1) / 2

總結可以得出,平均時間複雜度o(n)

優點

1.無須為表示表中邏輯關係而增加額外的儲存空間

2.可以快速的任意訪問表中任意位置的元素

缺點

1.插入和刪除操作需要移動大量元素(平均)

2.當線性表長度變化較大時,難以確定儲存空間的容量

3.造成儲存空間的碎片

儲存資料元素資訊的域稱為資料域,儲存後繼位置的域稱為指標域

指標域儲存的資訊稱作指標或鏈,兩部分資訊組成的儲存映像,稱為節點

n個結點鏈結成乙個鍊錶,即為線性表的鏈式儲存結構

鍊錶中第乙個結點儲存位置稱為頭指標,線性鍊錶 最後乙個節點為null,

為方便操作,會在單鏈表的第乙個結點前附設乙個結點,稱為頭結點

頭結點資料域可不儲存任何資訊,也可以儲存線性表的長度等附加資訊

頭指標

頭結點

#include #define error 0

#define ok 1

typedef int elemtype;

typedef int status;

typedef struct node

node;

typedef node *linklist;//或者寫為typedef struct node *linklist

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

if (!p || j > i)

return error;

*e = p->data;

return ok;

}int main()

int i = 3;

getelem(l, i, e);

printf("%d", k);

return 0;

}//輸出3,即從第乙個結點開始(非頭結點)

//從頭開始查詢,直到第i個元素為止,演算法時間複雜度取決於i的位置,當i = 1時不需要遍歷,若i = n,需要遍歷n - 1次才可以,時間複雜度o(n)

//核心思想:工作指標後移

思路:將s插入p和p->next之間,使s->next和p->next的指標做出一點改變

s->next = p->next; 

p->next = s;//順序不能改變

//如果交換相當於s->next = s,導致含有a(i + 1) 資料元素的節點沒了上級

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

if (!p || j > i)

return error;

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

s->data = e;

s->next = p->next;

p->next = s;

return ok;

}int main()

int e = 66;

int i = 3;

listinsert(&l, i, e);

printf("%d", n[2].next->data);

return 0;

}//輸出66

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

if (!(p->next) || j > i)

return error;

q = p->next;

p->next = q->next;

*e = q->data;

free(q);

return ok;

}

頭插法
//隨機產生n個元素的值,建立帶表頭結點的單鏈線性表(頭插法)

void createlisthead(linklist *l, int n)

}int main()

尾插法
//尾插法

void createlisttail(linklist *l, int n)

r->next = null;

}int main()

//單鏈表的整表刪除

status clearlist(linklist *l)

(*l)->next = null;

return ok;

}int main()

插入和刪除

線性表之順序儲存結構和鏈式儲存結構

一 順序儲存結構 線性表幾種基本操作的思路 1 插入演算法 1 插入位置不合理,丟擲異常 2 線性表長度超過 陣列長度,丟擲異常或者是動態增加陣列容量 效率會變低 3 從最後乙個元素向前遍歷到第i個位置,分別將它們後移一位。4 將要插入的元素插入在i處 5 線性表長度要 1 2 刪除演算法 1 刪除...

線性表之順序儲存結構和鏈式儲存結構

線性表包括順序表和煉表,其中鍊錶又包括單鏈表 迴圈鍊錶 雙向鍊錶。順序儲存結構和鏈式儲存結構有所不同,具體區別如下表所示 線性表是一種邏輯結構,相同資料型別的n個資料元素的有限序列,除第乙個元素外,每個元素有且僅有乙個直接前驅,除最後乙個元素外,每個元素有且僅有乙個直接後繼。線性表的特點 元素個數有...

線性表的順序儲存與鏈式儲存

線性表的順序儲存 include include include using namespace std define maxsize 100 define elementtype int typedef struct lnode list struct lnodel list ptr 初始化 li...