1. 程式人生 > 其它 >跟我一起學資料結構(C++語言版):連結串列

跟我一起學資料結構(C++語言版):連結串列

跟我一起學資料結構(C++語言版):連結串列

文章目錄


前言

學語言不學資料結構,猶如吃飯不放鹽,這可tm不是開玩笑。隨著我們的程式越寫越大,資料結構對我們也越來也重要。今天我們一起來學習連結串列。

一、連結串列是什麼

連結串列是通過一組任意的儲存單元來儲存線性表中的資料元素。那麼怎樣表示出資料元素之間的線性關係?為建立起資料元素之間的線性關係,對每個資料元素Vi,除了存放資料元素自身的資料資訊Vi之外,還需要存放其後繼Vi+1所在的儲存單元的地址,這兩部分資訊組成一個“結點”。如下圖:在這裡插入圖片描述

二、建立連結串列

1.連結串列是由一個個結點構成的,先定義結點:

程式碼如下(示例):

typedef int datatype;   //給 int 型別起一個別名 datatype
class item  //建立一個結點類
{
public:
	datatype data; //用於存放結點資料
	item* next;  //用於存放下一個結點的儲存位置
	item()   //建構函式
	{
		next = NULL; 
	}
};

2.建立連結串列類

一個基本的連結串列應該擁有一下功能:
1.從頭開始建立連結串列
2.從尾開始建立連結串列
3.建立帶表頭的連結串列(從頭)
4.建立帶表頭的連結串列(從尾)

5.求連結串列長度
6.查詢值為x的資料元素
7.查詢第i個元素
8.取第i個元素值
9.在連結串列第i個結點之前插入x
10.刪除連結串列中第i個結點
11.列印連結串列

程式碼如下(示例):

class link
{
public:
	item* head;  //連結串列頭指標
	link()
	{
		head = NULL; //建構函式
	}
	~link()
	{
		DeleteAll();//解構函式
	}
	void initiate(); // 初始化
	void DeleteAll();//刪除所有結點
	void HeadCreate(int n);//從頭開始建立連結串列
	void TailCreate
(int n);//從尾開始建立連結串列 void HeadCreateWithHead(int n); //建立帶表頭的連結串列(從頭) void TailCreateWithHead(int n); //建立帶表頭的連結串列(從尾) int Length(); //求連結串列長度 item *Locatex(datatype x); //查詢值為x的資料元素 item *Locatei(int i); //查詢第i個元素 datatype Get(int i); //取第i個元素值 bool Insert(datatype x, int i); //在連結串列第i個結點之前插入x bool Deleted(int i); //刪除連結串列中第i個結點 void Print(); //列印連結串列 };

3.初始化連結串列

程式碼如下(示例):

void link::initiate()
{
  DeleteAll();//刪除所有結點
  head = NULL;//頭指標指向空
}

4.從表尾到表頭建立單鏈表(不帶有空白頭結點)

連結串列是一種動態管理的儲存結構,連結串列中的每個結點佔用的儲存空間不是預先分配的,而是在執行時系統根據需求動態生成的,因此建立單鏈表應該從空表開始。可以在每讀入一個數據元素後申請一個結點,然後插在連結串列的頭部。
程式碼如下(示例):

void Link::HeadCreate(int n)//輸入的n為我們的連結串列長度
{
    DeleteAll();//刪除所有結點
    item *s, *p;//定義兩個結點類的指標
    int i;
    p=NULL;//先讓 p 指標指向空
    for(i=1; i<=n; i++)//開始迴圈,建立長度為n的連結串列
    {
        s=new Item();//給指標 s 申請一塊新的記憶體
        cin>>s->data;//輸入我們的資料
        s->next=p;//讓s->next指向p的位置
        p=s;
    }
    head=p;//把最新一個結點的資料賦值給head
 }

5.從表頭到表尾建立單鏈表(不帶有空白頭結點)

程式碼如下(示例):

void Link::TailCreate(int n)
{
 item *s, *r, *p;//頭指標為P,尾指標為r
    int i;
    DeleteAll();
 p=NULL;
 for(i=1; i<=n; i++)
    {
      s=new Item();
      cin>>s->data;
      s->next=NULL;
      if(p==NULL)p=r=s;
      else
      {
          r->next=s;
          r=s;
      }
    }
    head = p;
}

從表尾到表頭插入結點建立單鏈表比較簡單,但讀入的資料元素的順序與生成的單鏈表中元素的順序是相反的。若希望次序一致,則用從表頭到表尾建立單鏈表的方法。因為每次是將新結點插入連結串列的尾部,所以需加入一個指標r用來始終指向連結串列中的尾結點,以便能夠將新結點插入連結串列的尾部。

總結

連結串列是我們學習資料結構的入門操作,我再上面舉了幾個例子,其他的連結串列功能希望各位同學能觸類旁通,自己寫出來。