數據結構與算法(18)--線性表相關概念補充

線性表的類型定義

  • 線性結構的特點

    1. 存在唯一的一個被稱作"第一個"的數據元素
    2. 存在唯一的一個被稱作”最後一個“的元素
    3. 除第一個元素外,集合中的每個數據元素均只有一個前驅
    4. 除最後一個元素外,集合中的每個數據元素均只有一個後繼
  • 線性表

    是最常用且最簡單的一種數據結構。
    在線性表中,一個數據元素可以由若干個數據項組成,把數據元素稱爲記錄,含有大量記錄的線性表又稱爲文件。

  • 線性表的順序表示

    指的是用一組地址連續的存儲單元依次存儲線性表的數據元素。
    假設線性表的每個元素需佔用ll個存儲單元,並以所佔的第一個單元的存儲地址作爲數據元素的存儲位置。則線性表中第i+1i+1個數據元素的存儲位置LOC(ai+1)LOC(a_{i+1})和第ii個數據元素的存儲位置LOC(a_i)之間滿足的關係爲
    LOC(ai+1)=LOC(ai)+lLOC(a_{i+1}) = LOC(a_i)+l
    LOC(ai)=LOC(a1)+(i1)×lLOC(a_i) = LOC(a_1)+(i-1)\times l

  • 線性表的鏈式表示

    用一組任意的存儲單元存儲線性表的數據元素,這裏的元素可以是連續的,也可以是不連續的。
    對於一個元素來說,除了存儲本身的值,還需要存儲一個指向其後繼的結點的指針,即要有數據域和指針域;n個結點組成了一個鏈表。

  • 靜態鏈表

    利用一維數組來存儲鏈表

    #define MaxSize 1000
    typedef struct{
    	ElemType data;
    	int cur; // 這裏多了個cur,爲指示器,來代替指針指示結點在數組中的相對位置。數組中的第0分量可以看成頭結點,其指針域指示鏈表的第一個結點。
    }component,SLinkList[MaxSize];
    
  • 循環鏈表

    爲另一種形式的鏈式存儲結構。特點是表中最後一個結點的指針域指向頭結點,整個鏈表形成了一個環。

  • 雙向鏈表

    在雙向鏈表的指針域中有兩個指針,其中一個指向前驅,一個指向後繼。

代碼

  • 一個帶頭結點的線性鏈表類型的定義
    #define ElemType int
    #define Static bool
    typedef struct LNode{ //結點類型
    	ElemType data; // 數據域
    	struct LNode *next; //指針域,指向下一個結點
    } *Link,*Position;
    typedef struct{
    	Link head,tail; // 分別指向線性表中的頭結點和最後一個結點
    	int len; // 線性表中的元素個數
    }LinkList;
    
    //構造一個空的線性鏈表
    Static InitList(LinkList &L)
    {
    	Link p;
    	p = (Link)malloc(sizeof(LNode)); // 生成頭結點
    	if(p)
    	{
    		L.head = p;
    		L.tail = p;
    		L.len = 0;
    		p->next = NULL;
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }
    
    //分配由p指向的值爲e的結點,並返回true
    Status MakeNode(Link &p,ElemType e)
    {
    	p = (Link)malloc(sizeof(LNode)); // 分配一塊空間
    	if(p)
    	{
    		p->data = e; // 數據域
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }
    
    //釋放p指向的結點
    void FreeNode(Link &p)
    {
    	free(p);
    }
    
    //h指向L的一個結點,把h當做頭結點,將s所指結點插入在第一個結點之前
    Status InsFirst(LinkList &L,Link h,Link s)
    {
    	s->next = h->next;
    	h->next = s;
    	if(h == (L.tail))
    	{
    		//如果h和鏈表的尾指針指向同一個結點
    		//說明,原來鏈表中沒有數據,這時候修改尾指針,讓尾指針指向第一個結點
    		L.tail = h->next;
    	}
    	L.len++;
    	return true;
    }
    
    //返回鏈表中頭結點的位置
    Position GetHead(LinkList L)
    {
    	return L.head; 
    }
    
    //已知p指向線性鏈表中的一個結點,用e更新p所指結點中數據元素的值
    Status SetCurElem(Link p,ElemType e)
    {
    	p->data = e;
    	return true;
    }
    
    //已知p指向線性鏈表L中的一個結點,返回p所指結點的直接後繼的位置
    Position NextPro(Link p)
    {
    	return p->next; 
    }
    
    //已知p指向線性鏈表中的一個結點,返回p所指結點中數據元素的值
    ElemType GetCurElem(Link p)
    {
    	return p->data;
    }
    
    //h指向L的一個結點,把h當做頭結點,刪除鏈表中的第一個結點並以q返回
    Status DelFirst(LinkList &L,Link h,Link p)
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章