鏈表的定義:
鏈表也是一種線性表,它的數據的邏輯組織形式是一維的。鏈表的物理存儲結構使用一組地址任意的存儲單元存儲數據的。在鏈表中每個結點可以是一個結構體元素,當然也可以是其他構造類型元素。在鏈表的每一個結點中,有一個專門用來存檔指針的域,用這個指針來存放後繼結點的地址。
一個鏈表通常有一個表頭,它是一個指針變量,用來存放第一個結點的地址。此外,鏈表的最後一個結點的指針域要置空(NULL),因爲它沒有後繼結點。
一個鏈表的結點可以使用以下代碼描述:
typedef struct Node
{
int data; /*數據域*/
struct Node * next; /*指針域*/
} NODE, *PNODE;
創建一個鏈表:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Node
{
int data; /*數據域*/
struct Node * pNext; /*指針域*/
} NODE, * PNODE;
PNODE create_list(void);
void traverse_list(PNODE);
int main(void)
{
PNODE pHead= NULL;
pHead = create_list(); //創建一個非循環單鏈表
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 == pHead)
{
printf("分配失敗!\n");
exit(-1);
}
pNew->data = val;
pTail->pNext = pNew; //pTail指向最後一個結點
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
}
遍歷鏈表:
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;
while(NULL != p)
{
printf("%d ",p->data);
p = p->pNext;
}
printf("\n");
}
判斷鏈表是否爲空:
int is_empty(PNODE pHead)
{
if(NULL == pHead)
{
printf("鏈表爲空!\n");
return 1;
}
else
{
return 0;
}
}
計算鏈表的長度:
int length_list(PNODE pHead)
{
PNODE p = pHead->pNext;
int len = 0;
while(NULL != p)
{
len++;
p = p->pNext;
}
return len;
}