(C語言)連結串列的建立、遍歷、插入和刪除
阿新 • • 發佈:2018-12-25
作者:翁鬆秀
(C語言)連結串列的建立、遍歷、插入和刪除
連結串列結構定義
struct Node
{
int value;
struct Node* next;
};
typedef struct Node LinkList;
為了方便,把頭結點“當成”第一個節點。
基本功能實現
- 連結串列的建立
引數說明:n為要建立節點的長度,並將連結串列的value賦值為1到n。
LinkList* createList(int n)
{
int i;
LinkList *head = NULL;
LinkList *p = NULL;
LinkList *pAhead = NULL;
head = (LinkList *)malloc(sizeof(LinkList));
head->next = NULL;
pAhead = head;
for (i=1;i<n;i++)
{
p = (LinkList*)malloc(sizeof(LinkList));
p->value = i;
pAhead->next = p;
pAhead = p;
}
p->next = NULL;
return head;
}
- 連結串列的遍歷
引數說明:head為連結串列指標,即指標是指向連結串列頭結點的指標。
void printLinkList(LinkList *head)
{
LinkList *p = NULL;
p = head->next;
while(p)
{
printf("%d ",p->value);
p = p->next;
}
printf("\n");
}
連結串列的插入
引數說明:head為連結串列指標,Kth表示在第k個節點後面插入,value為要插入的節點的value值。
void insertNode(LinkList *head,int Kth,int value)
{
LinkList *p = NULL;
LinkList *temp = NULL;
p = head;
while(Kth>0)
{
p = p->next;
Kth--;
}
temp = (LinkList *)malloc(sizeof(LinkList));
temp->value = value;
temp->next = p->next;
p->next = temp;
}
- 連結串列的刪除
引數說明:head為連結串列指標,Kth為要刪除的節點為第k個。
void deleteNode(LinkList *head,int Kth)
{
LinkList *p = NULL;
LinkList *temp = NULL;
p = head;
while(Kth > 1)
{
p = p->next;
Kth--;
}
temp = p->next;
p->next = p->next->next;
free(temp);
}
邊界條件判斷和錯誤情況處理
上面小節實現了連結串列的建立、遍歷、插入和刪除基本功能,但是沒有考慮到邊界條件,比如說要建立的連結串列長度為0、連結串列為空、要插入節點的位置K大於連結串列的長度等等。雖實現了基本功能,但程式的完整性和魯棒性差,這樣的程式要是投入使用那簡直是夢魘。所以下面加入考慮邊界條件和錯誤處理情況:
- 邊界條件:要建立的連結串列長度為0、要遍歷的連結串列為空、在頭節點後插入節點、在連結串列尾節點後插入節點、刪除一個空連結串列。
- 錯誤處理:要插入或者刪除的節點位置大於連結串列的長度。
最後程式碼以及測試用例:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
//連結串列結構的定義
struct Node
{
int value;
struct Node* next;
};
typedef struct Node LinkList;
//連結串列的建立
LinkList* createList(int n)
{
int i;
LinkList *head=NULL;
LinkList *p=NULL;
LinkList *pAhead=NULL;
head = (LinkList *)malloc(sizeof(LinkList));
head->next = NULL;
pAhead = head;
for(i=1;i<n;i++)
{
p=(LinkList*)malloc(sizeof(LinkList));
p->value=i;
pAhead->next = p;
pAhead = p;
}
pAhead->next=NULL;
return head;
}
//連結串列的遍歷
void printLinkList(LinkList *head)
{
if(head == NULL)
{
printf("Null LinkList!\n");
return ;
}
LinkList *p;
p = head->next;
while(p)
{
printf("%d ",p->value);
p = p->next;
}
printf("\n");
return ;
}
//連結串列的插入
void insertNode(LinkList *head,int Kth,int value)
{
LinkList *p = NULL;
LinkList *temp = NULL;
p = head;
while(Kth>0)
{
if(p->next != NULL)
{
p = p->next;
Kth--;
}
else
{
printf("k > the length of LinkList!\n");
return ;
}
}
temp = (LinkList *)malloc(sizeof(LinkList));
temp->value = value;
temp->next = p->next;
p->next = temp;
return ;
}
//連結串列的刪除
void deleteNode(LinkList *head,int Kth)
{
if(head == NULL)
{
printf("Null LinkList!");
return ;
}
LinkList *p = NULL;
LinkList *temp = NULL;
p = head;
while(Kth > 1)
{
if(p->next != NULL)
{
p = p->next;
Kth--;
}
else
{
printf("k > the length of LinkList!\n");
return ;
}
}
temp = p->next;
p->next = p->next->next;
free(temp);
return ;
}
int main()
{
//基本功能測試
LinkList *head = createList(10);
printLinkList(head);
insertNode(head,5,0);
deleteNode(head,6);
printLinkList(head);
//邊界條件測試
LinkList *zHead = createList(0);
printLinkList(zHead);
printLinkList(NULL);
LinkList *iHead = createList(5);
insertNode(iHead,1,20);
insertNode(iHead,5,21);
printLinkList(head);
//錯誤處理測試
LinkList *eHead = createList(10);
insertNode(eHead,11,1);
deleteNode(eHead,12);
return 0;
}
測試結果
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
Null LinkList!
1 2 3 4 5 6 7 8 9
k > the length of LinkList!
k > the length of LinkList!
總結
寫程式不但要實現基本功能,還要考慮程式的邊界條件以及錯誤輸入或者操作時應有的處理,增強程式的完整性和魯棒性,不能輸入一個空指標程式就crash。