鏈表的相關函數操作
- 頭文件
- 結構體的定義
- 函數聲明
- 主函數
- 函數
- 鏈表與數組的優缺點
# 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;
}
鏈表的遍歷
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
數據的存儲結構分爲線性和非線性
線性分爲連續存儲( 數組)和離散存儲 (鏈表) 應用爲棧和隊列
數組 :
存儲速度快,但插入元素很慢空間通常有限制
鏈表 :
空間無限制,插入刪除元素很快 但是存取的速度慢
非線性的爲
樹
圖