1. 程式人生 > >資料結構C++單鏈表的實現

資料結構C++單鏈表的實現

前言:之前看過這方面的知識,但是因為用得少,所以也忘記了。因為現在的工作經常要看原始碼,而原始碼裡面經常也會有資料結構裡面的知識,比如說,handler 相關的訊息出隊和入隊。所以打算寫個一系列的文章幫助自己加深印象。

一、單鏈表介紹
單鏈表的每一個節點由資料域和指標域組成。如圖1.1所示
圖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;
}

好了,單鏈表就寫到這裡,後續會有一系列的,包括雙鏈表、佇列、棧、迴圈佇列,二叉樹等。有問題歡迎指出。