11樓的代碼,給出了單向鏈表生成、插入元素、刪除元素的操作實現,僅供參考。

授人以渔,不授人以鱼。

程序代码:
#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** head, Node* 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** head, Node* node)
{
if (node == *head)
{
*head = node->Next;
}
else
{
Node* previous = NULL; // 前一個元素
Node* p = *head; // 遍歷指針
while ((p != NULL) && (p != node))
{
previous = p;
p = p->Next;
}
previous->Next = node->Next;
}
free(node);
return *head;
}
// 輸出結點的信息
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);
}
}

