/*
get1、我這裡的單獨建立了乙個結構體 list來儲存整個鍊錶的資訊和一般的參考書上可能不一樣
2、實際的單鏈表由 list裡面的 頭結點head進行連線。
3、頭結點有資料域和指標域 ,資料域可以任意替換
4、本程式實現了
①、單鏈表的建立(使用尾插法,符合先進先出的生活邏輯。頭插法也可以)
②、單鏈表的刪除(釋放所有節點,head=null, 鍊錶長度為0);
③、節點的插入、刪除、查詢(獲取)
5、單鏈表 <->順序儲存結構 相比較(優缺點)
① 插入和刪除: 順序儲存複雜度是 o(n),單鏈表第一次o(n),之後o(1)。 所以 對於插入和刪除越頻繁的工作,單鏈表的效率就越明顯。
因為如果在同一位置連續插入10個元素, 第一次插入的時候如要逐個遍歷找到插入點, 但是之後就可以記錄下次插入點, 後面的幾次插
入就要快得多了。但是對於順序儲存結構的話,還要每次都要把插入點後面的元素向後移動,這樣會耗費很多時間的。
② 任一儲存單元的鏈式儲存結構 <-> 連續的儲存單元依次存放元素的順序儲存結構
③ 時間效能:
查詢:單鏈表o(n) 順序o(1)
插入刪除:單鏈表o(n)->o(1) 順序o(n);
④ 空間效能:
順序儲存需要預備更多的空間,會產生浪費。如果空間小了還會溢位。
單鏈表,隨時用隨時申請,不用了還可以釋放。
*/#include #include #include #define ok 1
#define error 0
#define true 1
#define false 0
typedef int elemtype;
typedef struct node
node;
typedef struct
list;
typedef int status;
//這個是尾插法 初始化鍊錶。 還有在我的程式裡面 我把node封裝在了乙個list結構體裡面 ,
//list的變數用來說明這個list的屬性
status initlist(list *list, int nodeamount);
//複雜度 o(n) 對於插入和刪除越頻繁的工作,單鏈表的效率就越明顯(在同一位置連續插入10個元素)
status insert(list *list, elemtype e, int index);//鍊錶下標還是從1開始
status delete(list *list, int index);
//獲取單個元素
status getelem(list *list, elemtype *e, int index);
//整表刪除
status freelist(list *list);
void test(list *list);
status iteratoroutput(list *list);
/* 1、鍊錶的建立與初始化(帶有頭指標)
2、遍歷鍊錶
3、單鏈表的插入和刪除(刪除後 記得釋放記憶體 鍊錶的長度的加減)
*///頭結點使得空鍊錶與非空煉表處理一致,並且方便對鍊錶的第乙個結點的插入和刪除操作。
int main(void)
e = 999;
//插入元素 e=999
if (insert(&list, e, 1) != ok )
// test(&list);
//刪除指定位置的元素
if (delete(&list, 4) != ok )
//遍歷鍊錶
iteratoroutput(&list);
//獲取前面插入的 999
getelem(&list, &e1, 1);
printf("\n獲取指定位置的元素進行輸出:%d\n", e1);
printf("釋放鍊錶\n");
freelist(&list);
printf("釋放後再對鍊錶進行遍歷,檢查是否釋成功:\n");
iteratoroutput(&list);
return 0;
}//手動申請的空間,不會被自動**。 不限制與這個函式的作用域裡面。
status initlist(list *list, int nodeamount)
p->next=null;
status = ok;
return status;
}status insert(list *list, elemtype e, int index)
for (i = 0; i < index - 1; i++)
node = (node *)malloc(sizeof(node)); //為插入的節點申請空間
node ->data = e;
node->next = p->next;
p->next = node;
list->length++; //鍊錶長度+1
return ok;
}status delete(list *list, int index)
else
r = p->next;
p->next = p->next->next;
free(r);
status = ok;
list->length--;//鍊錶長度-1
}return status;
}//不同的資料域需要有不同的輸入格式和輸出格式 在c語言裡面 如果遍歷得到每個元素的話,不太方便。
//因為不好設定iterator物件 還不如直接遍歷
status iteratoroutput(list *list)
p = list->head->next;
while(p) //c語言的null在實際的底層**中就是0
return ok;
}status getelem(list *list, elemtype *e, int index)
//1 2 3 4 5
for (i = 0; i < index; i++)
*e = p->data;
return ok;
}status freelist(list *list)
list->length = 0;
list->head = null;
return ok;}/*
void test(list *list)
}*/
單鏈表基本操作 初始化,建立,插入,查詢,刪除
單鏈表的初始化,建立,插入,查詢,刪除。include include typedef int elemtype 定義結點型別 typedef struct node node,linkedlist 單鏈表的初始化 linkedlist linkedlistinit 單鏈表的建立1,頭插法建立單鏈表...
單鏈表的初始化,刪除,銷毀,查詢
單鏈表的初始化,頭刪,尾刪,頭插,尾插,銷毀,查詢。node.h ifndef node h define node h typedef int datatype define null 0 include include includetypedef struct node node,linkli...
單鏈表的初始化
方法一 include using namespace std struct listnode class solution cout head val return positiveoutput head next 該函式的作用是倒序輸出結點值 listnode reverseoutput lis...