鏈表各種操作總結

鏈表的相關函數操作

  1. 頭文件
  2. 結構體的定義
  3. 函數聲明
  4. 主函數
  5. 函數
  6. 鏈表與數組的優缺點
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
# include <stdbool.h>

typedef    struct Node 
{
	int date ;      //作爲鏈表的數據域
	struct Node *pNext ;    //作爲鏈表的指針域,用於指向結構體類行的下一個節點
} NODE  ,*PNODE ;          //  NODE 等價於 struat node  PNODE 等價於  struct  Node *

//對將要用到的函數進行聲明
PNODE create_list (void);    //建立鏈表
void traverse_list (PNODE pHead);  //遍歷鏈表
bool is_empty (PNODE pHead);      //判斷鏈表是否爲空
int length_list (PNODE pHead );   //求出鏈表的長度,將長度作爲int 型數值返回
bool insert_list (PNODE ,int ,int );  //插入節點
bool delete_list (PNODE ,int ,int *);     //刪除第int 個節點,並記錄刪除節點的數據
void soert_list (PNODE);                //節點排序




int  main (void )
{
	PNODE pHead =NULL;      //等價於   struct Node *pHead=NULL
	int val;                //用於記錄刪除節點的數據


	pHead =create_list (pHead);  //創建一個非循環的單鏈表,並將該鏈表的首給pHead
	traverse_list (pHead);

	int len =length_list (pHead);
	printf ("鏈表的長度是  %d \n",len );

	insert_list (pHead,4,33);
	traverse_list (pHead);

    
    soert_list (pHead);
    traverse_list (pHead);

	if (delete_list (pHead,4,&val))
	{
		printf ("刪除成功,您刪除的元素是: %d\n",val);
    }
    else 
    {
        printf ("刪除失敗!您刪除的元素不存在。\n");
     }
     traverse_list (pHead);



     if (is_empty (pHead))
           printf ("鏈表爲空!  \n");
     else 
          printf ("鏈表不爲空!  \n");
     
     return 0;
}     
                   

創建鏈表函數

PNODE create_list (void)
{
   int len ;    //用於存放有效節點的個數
   int i;
   int val;      //用於臨時存放用戶輸入的節點的值
   PNODE pHead =(PNODE )malloc (sizeof(NODE));      //分配了一個不存放有效數據的頭節點
   if  (NULL==pHead)
   {
         printf (" 分配失敗,程序終止  !\n");
         exit (-1);
    }  
    PNODE pTail=pHead;
    pTail->pNext =NULL; 
    printf ("請輸入您需要生成的鏈表節點的個數  :len= ");
    scanf ("%d",&len);

    for (i=0;i<len;++i)
    {
        printf ("請輸入第%d 個節點的值:",i+1);
        scanf ("%d",&val);
        
        PNODE pNew =(PNODE )malloc (sizeof (NODE));
        if (NULL==pNew)
        {
           printf ("分配失敗,程序終止!\n");
           exit (-1);
        }
        pNew->date=val;
        pTail->pNext=pNew;
        pNew->pNext=NULL;
        pTail=pNew;
      }
      return pHead;   
}
   

22這裏插入圖片描述

鏈表的遍歷

void traverse_list (PNODE pHead)
{
  PNODE p=pHead->pNext ;
  
  while (NULl!=p)
  {
     printf ("%d",p->date);
     p=p->pNext;
  }
  printf ("\n");

  return 0;
}  

判斷鏈表是否爲空

bool is_empty (PNODE pHead)
{
    if (pHead->pNext==NULL)
    return true;
    else 
    return false;
 }   

bool 是布爾型變量 頭文件是 #include <stdbool.h>
BOOL是布爾型變量,也就是邏輯型變量的定義符,類似於float、double等,只不過float定義浮點型,double定義雙精度浮點型。在objective-c中提供了相似的類型BOOL,它具有YES值和NO值。布爾型變量的值只有 真(true)和假(false),可用於邏輯表達式,也就是“或”“與”“非”之類的邏輯運算和大於小於之類的關係運算,邏輯表達式運算結果爲真或爲假。 (百科)
例如
bool b;
b=(1>2);
此時b=true。

求鏈表的長度

int length_list (PNODE pHead)
{
   PNODE p=pHead->pNext;
   int len =0;

   while (NULL!=p)
   {
       ++len ;
       p=p->pNext;
   }   
   return len;
}

使p指向節點的指針域,當所指向的指針域不爲空時len +1,不包括首節點。

++i 和 i++的區別:
++ i 是先加後賦值;i ++ 是先賦值後加;++i和i++都是分兩步完成的

鏈表的排序

void soert_list (PNODE pHead)
{
   int i,j,t;
   int len =length_list (pHead);
   PNODE p,q;
   for (i=0,p=pHead->pNext;i<len-1;i++,p->pNext)
   {
      for (j=i+1,q=p->pNext;j<len-1;++j,q=q->pNext)
      {
          if (p->date>q->date)     //類似於數組中的 a[i]>a[j]
          {
             t=p->date;     //類似於數組中的  t=a[i]
             p->date=q->date;    //類似於數組中的a[i]=a[j]
             q->date=t;          //類似於數組中的  a[j]=t;
           }
       }
    }
             
        return ;
}                      



泛型的定義:
利用某種技術達到的效果(使不同存儲方式執行的操作相同)

新鏈表的插入

//在pHead所向鏈表的第pos 個節點的前面插入一個新的節點,該節點的值是val,並且pos 的值是從1開始
bool insert_list (PNODE pHead,int pos,int val)
{
  int i=0;
  PNODE p=pHead;
   
   while (NULL!=p&&i<pos-1)
   {
      p=p->pNext;
      ++i;
   }
   if (i>pos-1||NULL==p)
   return false;
   
   PNODE pNew = (PNODE)malloc (sizeof(NODE ));
   if (NULL==pNew)
   {
      printf ("動態分配內存失敗! \n");
      exit (-1);
    }
    pNew->date=val;
    PNODE q=p->pNext;
    p->pNext=pNew;
    pNew->pNext=q;


    return true ;
 }     
     

鏈表的刪除

bool delete_list (PNODE pHead,int pos,int *pVal)
{
   int i=0;
   PNODE p=pHead;

   while (NULL!=p->pNext&&i<pos-1)
   {
     p=p->pNext;
     ++i;
   }
 
   if (i>pos-1||NULL==p->pNext)
   return false;

    PNODE q=p->pNext;
    *pVal=q->date ;

    // 刪除p 節點後面的節點
    p->pNext=p->pNext->pNext;
    free (q);
    q=NULL;
    return   true;
} 
    

6
數據的存儲結構分爲線性和非線性
線性分爲連續存儲( 數組)和離散存儲 (鏈表) 應用爲棧和隊列
數組 :
存儲速度快,但插入元素很慢空間通常有限制
鏈表 :
空間無限制,插入刪除元素很快 但是存取的速度慢

非線性的爲

發佈了6 篇原創文章 · 獲贊 1 · 訪問量 1213
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章