資料結構C++單鏈表的實現
阿新 • • 發佈:2019-01-10
前言:之前看過這方面的知識,但是因為用得少,所以也忘記了。因為現在的工作經常要看原始碼,而原始碼裡面經常也會有資料結構裡面的知識,比如說,handler 相關的訊息出隊和入隊。所以打算寫個一系列的文章幫助自己加深印象。
一、單鏈表介紹
單鏈表的每一個節點由資料域和指標域組成。如圖1.1所示
圖1.1
資料域是存放資料,指標域放的是存放下一個節點的地址。現在大多數為了方便,我們都會有一個頭結點,頭結點的資料域不存放任何資料。指向頭結點的指標叫頭指標。帶頭結點的單鏈表,如圖1.2所示
圖1.2
不帶頭結點的單鏈表如圖1.3所示:
圖1.3
二、單鏈表的建立及操作:
1、建立 節點
//含有頭結點的單鏈表,頭結點只有指標域沒有資料域
typedef struct Node{
int data;
struct Node * next;
}Node;
typedef struct Node * LinkList;//定義linklist
2.頭插法建立單鏈表–每次插入的節點都在第一的位置
//頭插法建立單鏈表,就是始終讓新插入的節點在第一的位置
void creatListHead(LinkList *L, int num){
LinkList p;
int i = 0;
*L = (LinkList)malloc(sizeof(Node));//為頭結點分配記憶體
(*L )->next = null;
for(int i=0; i< num; i++){
p = (LinkList)malloc(sizeof(Node));
p->data = rand()%100+1;//隨機生成100以內的數字
p->next = (*L)->next;
(*L)->next = p;
}
}
尾插法建立單鏈表:
//尾插法建立單鏈表,
void creatListTail(LinkList *L, int num){
LinkList p, r;
int i = 0;
*L = (LinkList)malloc(sizeof (Node));//為頭結點分配記憶體
(*L)->next = null;
r=(*L);//r 指向頭結點
for(int i=0; i< num; i++){
p = (LinkList)malloc(sizeof(Node));
p->data = rand()%100+1;//隨機生成100以內的數字
r->next = p; //將 r指向新節點
r = p; //r 始終指向最後一個節點
}
r->next = null; //最後一個節點的指標域為置為 null;
}
3.整表刪除
//整表刪除
void deleteLinkList(LinkList *L){
LinkList p, q;
p = (*L)->next; //p 指向第一個節點
while(p){ //是否到表尾
q = p->next;
free(p); // 刪除p節點,並進行記憶體釋放
p = q;
}
(*L)->next = null; //頭結點的指標域置空null
}
4.遍歷整個連結串列
//遍歷整個連結串列
void traverseLinkList(LinkList *L){
LinkList p = (*L)->next;
while(p){
printf(“%d”, p->data);
p = p->next;
}
}
5.在任意位置插入節點
//在任意位置插入節點
/**
* 1=<index<= 連結串列的長度
*/
int insert(LinkList *L, int value, int index){
LinkList p , s;
int i = 1;
p = (*L)//指向頭節點、
while(p && i<index){
p = p->next;
i++;
}
if(!p || i>index){//沒找到資料
return -1;
}
s = (LinkList)malloc(sizeof(Node));
s->data = value;
s->next = p->next;
p->next = s;
return 0;
}
6.在任意位置刪除節點
/*
* 刪除指定位置的節點
* 1=<index<= 連結串列的長度
*/
int delete(LinkList *L, int index){
LinkList p , q;
int i = 1;
p = (*L)//指向頭節點、
while(p->next && i<index){
p = p->next;
i++;
}
if(!(p->next) || i>index){//沒找到資料
return -1;
}
q = p->next;
int data = q->data;
p->next = q->next;
free(q);
return data;
}
7.獲取連結串列長度
int getLength(LinkList *L){
LinkList p = (*L);
int i = 0;
while(p->next){
i++;
p = p->next;
}
return i;
}
好了,單鏈表就寫到這裡,後續會有一系列的,包括雙鏈表、佇列、棧、迴圈佇列,二叉樹等。有問題歡迎指出。