修改一下測試用例,補充在鏈表中插入和刪除元素的功能。
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
// 結點數據結構
struct Node
{
int Value; // 數據的内容(按需要可爲任何數據類型)
Node* Next; // 數據的地址
};
// 函數原型
void Pause(void);
Node* InsertNode(Node* to, Node* from);
Node* DeleteNode(Node* const head, Node* const node);
void ShowData(const Node* node);
void ListLinkData(const Node* head);
void FreeLink(Node* head);
// 程序主入口
int main(void)
{
Node* linkHead = NULL;
printf_s("從數組中提取數據生成鏈表\n");
int data[] = { 1, 2, 3, 4, 5 };
Node* node = linkHead;
for (int index = 0; index < _countof(data); ++index)
{
Node* p = (Node*)calloc(1, sizeof(Node));
p->Value = data[index];
node = InsertNode(node, p);
if (linkHead == NULL)
{
linkHead = node;
}
}
ListLinkData(linkHead);
putchar('\n');
printf_s("在第2個元素後面插入一個新的元素\n");
node = (Node*)calloc(1, sizeof(Node));
node->Value = 10;
InsertNode(linkHead->Next, node);
ListLinkData(linkHead);
putchar('\n');
printf_s("刪除剛才插入元素的下一個\n");
DeleteNode(linkHead, node->Next);
ListLinkData(linkHead);
putchar('\n');
FreeLink(linkHead);
Pause();
return EXIT_SUCCESS;
}
// 暫停等待用戶按鍵
void Pause(void)
{
printf_s("\n按任意鍵繼續...");
_getch();
}
// 將form元素插入在to元素後,如果to爲NULL,則將from創建爲鏈頭,返回from
Node* InsertNode(Node* to, Node* from)
{
Node* last = NULL;
if (to != NULL)
{
if (to->Next != NULL)
{
last = to->Next;
}
to->Next = from;
from->Next = last;
}
return from;
}
// 刪除指定的結點node,返回其後的結點
// 對單向鏈表,爲了查尋前面的元素,必須從鏈表開始檢索,所以需要傳入鏈頭
Node* DeleteNode(Node* const head, Node* const node)
{
Node* previous = NULL; // 前一個元素
Node* p = head; // 遍歷指針
while ((p != NULL) && (p != node))
{
previous = p;
p = p->Next;
}
previous->Next = node->Next;
free(node);
return node->Next;
}
// 輸出結點的信息
void ShowData(const Node* node)
{
printf_s("Adress = %p, Value = %d, Next = %p\n", node, node->Value, node->Next);
}
// 從指定的結點開始列出鏈表數據
void ListLinkData(const Node* head)
{
if (head != NULL)
{
const Node* node = head;
do
{
ShowData(node);
node = node->Next;
} while (node != NULL);
}
}
// 刪除並釋放從指定節點開始的鏈表數據
void FreeLink(Node* head)
{
if (head != NULL)
{
Node* next;
do
{
next = head->Next;
free(head);
head = NULL;
head = next;
} while (next != NULL);
}
}
運行效果:
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
[
本帖最后由 TonyDeng 于 2015-3-17 17:58 编辑 ]