1. 程式人生 > 其它 >線性表及其實現—鏈式儲存(連結串列篇)

線性表及其實現—鏈式儲存(連結串列篇)

線性表的鏈式儲存實現

不要求邏輯上相鄰的兩個元素物理上也相鄰;通過“鏈”建立起資料元素之間的邏輯關係。

• 插入、刪除不需要移動資料元素,只需要修改“鏈”。

typedef struct lnode *list; //取別名 struct lnode *結構體指標等價於list
struct lnode{   //建立結構體 
	int data;  ///儲存資料部分 
	list next;  //儲存下一個結點 
}; 
struct lnode l;  //定義一個結構體 l 
list ptrL;    //定義一個結構體指標變數 

主要操作的實現

1、求連結串列長度

int length(list ptrl) //形參 連結串列的頭結點
{
	list p=ptrl; /* p指向表的第一個結點*/
	int j=0;
	while (p){
		p=p->next;  //指標向後移動,遍歷整個連結串列 
		j++       //遍歷連結串列的同時記錄連結串列長度 
	}
	return j; 
 } 

2.1按序號查詢

 list findkth(int k;list ptrl)
 {	list p=ptrl;  //將頭節點的地址賦給p
 	int i=1;
	 while(p!=NULL&&i<k){
	 	p=p->next;
	 	i++;
	 } 
	 if(i==k)return p; /* 找到第K個,返回指標 */
	 else return NULL; /* 否則返回,返回空 */
 } 

2.2按值查詢 :

 list find(int x;list ptrl)
 {
 	list p=ptrl;
 	while (p!=null&&p->data!=x)
 		  p=p->next;
    return p;
  } 

3.插入操作的實現(在第 i-1(1≤i≤n+1)個結點後插入一個值為X的新結點)

/(1)先構造一個新結點,用s指向;
(2)再找到連結串列的第 i-1個結點(即要插入位置的前一個結點),用p指向;
(3)然後修改指標,插入結點 ( p之後插入新結點是 s
/

list insert( int x, int i, list ptrL )
{ list p, s;
 if ( i == 1 ) { /* 新結點插入在表頭 */
 s = (list)malloc(sizeof(struct lnode)); /*申請、填裝結點*/
 s->data = x; 
 s->next = ptrL;
 return s; /*返回新表頭指標*/
 }
 p = findkth( i-1, ptrL ); /* 查詢第i-1個結點 通過  findkth函式查詢 返回 其地址 
 if ( p == NULL ) { /* 第i-1個不存在,不能插入 */
 printf("引數i錯");
 return NULL; 
 }else {
 s = (list)malloc(sizeof(struct lnode)); /*申請、填裝結點*/
 s->data = x; 
 s->next = p->next; /*新結點插入在第i-1個結點的後面*/
 p->next = s; 
 return ptrL;
 }
  1. 刪除(刪除連結串列的第 i (1≤i≤n)個位置上的結點)
    //(1)先找到連結串列的第 i-1個結點,用p指向;
    //(2)再用指標s指向要被刪除的結點(p的下一個結點);
    //(3)然後修改指標,刪除s所指結點;
    //(4)最後釋放s所指結點的空間。
list delete( int i,list ptrl)//傳入 要刪除節點的序號,和連結串列的頭結點 
{
	list p,s; 
	if(i==1)
	{//如果要刪除的結點就是頭結點 
        s=ptrl;
        if(ptrl!=NULL)ptrl=ptrl->next;
        else return NULL;
 	    free(s);
        return ptrl;
    }
 	    p=findkth(i-1,ptrl);  /*查詢第i-1個結點*/
    if ( p == NULL ) 
	{ 
    	 printf(“第%d個結點不存在”, i-1); return NULL; 
    } 
    else if ( p->next == NULL )
   { 
 		  printf(“第%d個結點不存在”, i); return NULL; 
   } 
	else 
	{
 	  	 s = p->next; /*s指向第i個結點*/
 	  	 p->next = s->next; /*從連結串列中刪除*/
 		 free(s); /*釋放被刪除結點 */
	     return ptrL;
    }
	   }
	} 
 }