#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...