又重復了鏈表創建,鏈表輸出,鏈表結點遍歷,
主角當然是鏈表結點刪除。
鏈表結點刪除,有三種情況:
情況1,刪除頭結點。只要把鏈表結構指針,指向第二個結點。
情況2,刪除最後結點。只要把倒數第二個結點的next指針指向NULL就行。
情況3,刪除中間結點。只要把中間結點的上一個節點next指針指向中間結點的next指針指向的地方就行。
鏈表結點遍歷,就是為了找出要刪除的結點的上一個節點。
具體代碼如下:
/* ======================================== */
/* 程式實例: 3_5.c */
/* 鏈結串列的節點刪除 */
/* ======================================== */
#include <stdlib.h>
struct llist /* 串列結構宣告 */
{
int num; /* 郵寄編號 */
struct llist *next; /* 指向下一標簽 */
};
typedef struct llist node; /* 定義新型態 */
typedef node *llink; /* 定義新型態指標 */
/* ---------------------------------------- */
/* 鏈結串列的列印 */
/* ---------------------------------------- */
void printllist(llink ptr)
{
while ( ptr != NULL ) /* 串列走訪回路 */
{
printf("[%d]",ptr->num); /* 列印節點資料 */
ptr = ptr->next; /* 指向下一節點 */
}
printf("
"); /* 換行 */
}
/* ---------------------------------------- */
/* 鍵結串列的建立 */
/* ---------------------------------------- */
llink createllist(int *array,int len)
{
llink head; /* 串列的開始指標 */
llink ptr,ptr1;
int i;
/* 建立第一個節點 */
head = ( llink ) malloc(sizeof(node)); /* 配置記憶體 */
if ( !head ) /* 檢查指標 */
return NULL;
head->num = array[0]; /* 建立節點內容 */
head->next = NULL; /* 設定指標初值 */
ptr = head; /* 將ptr指向串列開始 */
for ( i = 1; i < len; i++ ) /* 建立其它節點回路 */
{
ptr1 = ( llink ) malloc(sizeof(node));
if ( !ptr1 )
return NULL;
ptr1->num = array[i]; /* 建立節點內容 */
ptr1->next = NULL; /* 設定指標初值 */
ptr->next = ptr1; /* 連結節點 */
ptr = ptr->next; /* 指向下一節點 */
}
return head;
}
/* ---------------------------------------- */
/* 鏈結串列的節點走訪 */
/* ---------------------------------------- */
llink findnode(llink head,int num)
{
llink ptr;
ptr = head; /* 指向串列起始 */
while ( ptr != NULL ) /* 走訪串列 */
{
if ( ptr->num == num ) /* 找尋編號 */
return ptr;
ptr = ptr->next; /* 指向下一節點 */
}
return ptr;
}
/* ---------------------------------------- */
/* 鍵結串列的節點刪除 */
/* ---------------------------------------- */
llink deletenode(llink head,llink ptr)
{
llink previous; /* 指向前一節點 */
if ( ptr == head ) /* 是否是串列開始 */
/* 第一種情況: 刪除第一個節點 */
return head->next; /* 傳回第二節點指標 */
else
{
previous = head;
while ( previous->next != ptr ) /* 找節點ptr的前節點 */
previous = previous->next;
if ( ptr->next == NULL ) /* 是否是串列結束 */
/* 第二種情況: 刪除最後一個節點 */
previous->next = NULL; /* 最後一個節點 */
else
/* 第三種情況: 刪除中間節點 */
previous->next = ptr->next; /* 中間節點 */
}
return head;
}
/* ---------------------------------------- */
/* 主程式: 找到郵寄編號後, 將之刪除. */
/* ---------------------------------------- */
void main()
{
int llist1[6] = { 1, 2, 3, 4, 5, 6 }; /* 陣列內容 */
llink head; /* 指向串列開始 */
llink ptr;
int num; /* 郵寄編號變數 */
head = createllist(llist1,6); /* 建立串列 */
if ( !head )
{
printf("記憶體配置失敗!
");
exit(1);
}
printf("原來的鏈表: ");
printllist(head); /* 列印原來串列 */
while ( 1 )
{
printf("請輸入要刪除的郵寄編號 ==> ");
scanf("%d",&num); /* 讀取郵寄編號 */
if ( num != -1 )
{
ptr = findnode(head,num); /* 找尋郵寄編號 */
if ( !ptr ) /* 是否找到 */
printf("沒有找到
");
else
{
head = deletenode(head,ptr); /* 刪除此節點 */
printf("刪除後的鏈表: ");
printllist(head); /* 列印刪除後串列 */
}
}
else
exit(1); /* 結束離開 */
}
}