線性表是最基本的一種數據結構,是0個以上數據元素的有限序列。
由線性表的定義,我們可以得出線性表的兩個特性。
首先它是一個序列,即元素之間是有序的。除了第一個元素外,每一個元素都有且只有一個直接前驅元素;除了最后一個元素外,每一個元素都有且只有一個直接后驅元素。也就是說,元素之間是一對一連接起來的。
其次它的元素是有限的,最少為0個,當元素為0個時,稱之為空表。
根據線性表的序列特性,計算機可以用兩種方法來實現線性表:
1、開辟一塊連續的內存,將數據元素一個一個放入進去,說白了也就是用數組來實現線性表。這種實現方式對於讀數據來說比較快,但對於插入和刪除來說,就比較尷尬了。一般來說,不會用這種方法實現線性表這種數據結構。
2、鏈表。(重點來了)
鏈表是一種遞歸的數據結構。
鏈表中的元素為結點,結點由兩部分組成,一是存儲元素值的數據域、二是存儲指向下一個結點地址的指針域(或者是NULL),如果該結點的指針域為NULL,則稱該結點為尾結點,也就是鏈表的結尾。
以下簡單的代碼讓同學們更加直觀的感受一下鏈表。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node* next;
}Node, *PNode;
// 聲明創建鏈表函數
PNode CreateList(void);
// 聲明遍歷鏈表函數
void PrintfList(PNode List);
int main()
{
PNode List = CreateList();
PrintfList(List);
getchar();
return 0;
}
PNode CreateNode()
{
PNode newNode = (PNode)malloc(sizeof(Node));
if (newNode == NULL) {
printf("out of memory.\n");
exit(1);
}
newNode->next = NULL;
return newNode;
}
PNode CreateList(void)
{
int length; //鏈表個數,作為循環結束的條件
ElemType data; //鏈表結點數據域的值
PNode Head = CreateNode();
PNode s = Head;
printf("輸入鏈表個數:");
scanf_s("%d", &length);
for (int i = 1; i <= length; i++){
PNode P = CreateNode();
printf("第%d個結點的data值:", i);
scanf_s("%d", &data);
while (s->next) {
s = s->next;
}
P->data = data;
s->next = P;
}
getchar();
printf("創建鏈表成功\n");
return Head;
}
void PrintfList(PNode List)
{
PNode P = List->next;
printf("鏈表為:");
if (P == NULL) {
printf("鏈表為空");
}
while (P != NULL){
printf("%d", P->data);
P = P->next;
}
printf("\n");
}
可能有人會說,就這么簡單的輸出幾個數字,搞得這么麻煩,我一個數組就直接搞定了。
哼,我才不管你呢。增刪的好處我也不會告訴你的。