| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2165 人关注过本帖, 4 人收藏
标题:詳解鏈表
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
修改一下測試用例,補充在鏈表中插入和刪除元素的功能。
程序代码:
#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 编辑 ]

授人以渔,不授人以鱼。
2015-03-17 17:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
11樓的代碼,給出了單向鏈表生成、插入元素、刪除元素的操作實現,僅供參考。

授人以渔,不授人以鱼。
2015-03-17 18:01
执笔画江山
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:265
专家分:1010
注 册:2015-1-13
收藏
得分:0 
哇塞  顶起  版主辛苦了。最近一直在攻克链表这块。
真是太好了。

授人以鱼,不如授人以渔
2015-03-17 18:15
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
版主的繁体字好多都不认识,眼睛都看花了

一片落叶掉进了回忆的流年。
2015-03-17 18:49
执笔画江山
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:265
专家分:1010
注 册:2015-1-13
收藏
得分:0 
以下是引用诸葛欧阳在2015-3-17 18:49:55的发言:

版主的繁体字好多都不认识,眼睛都看花了

还好  增加了我们对汉字的认识

授人以鱼,不如授人以渔
2015-03-17 19:35
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
T版雖然是用繁體字,但是一些專有名詞依然是大陸用語,很多都要再去維基一下才知道是什麼意思。例如:
對象:物件
面向:??(不知道)
棧:堆疊(stack)
堆:堆積(heap)
指針:指標
變量:變數
聲明:定義
字符:字元
字符串:字串
數組:陣列
鏈表:Link List
地址:位址

....等等

如果只是簡繁互換,也沒什麼,但是專有名詞互換,那就頭大了。

不要選我當版主
2015-03-17 19:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 16楼 wube
下次附英文好了。老實説,這才是最成問題的,臺陸事實分裂多年,文化愈益分離,縱然字型相同,然而名詞術語不同,則本質屬於不同的文化,一個世紀過去,獨立的民族足以成型,衹有大陸仍自欺欺人,說什麽時間充足,優勢在自己一邊。正如魯迅文章中所說,一蟹不如一蟹,最糟糕的還是自我陶醉,不知危險之將至。

[ 本帖最后由 TonyDeng 于 2015-3-17 20:30 编辑 ]

授人以渔,不授人以鱼。
2015-03-17 19:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在這裏順便說一下我的字體問題:

1.正體字是中華民族的傳統字型,秦始皇剿滅六國之後,書同文,鑄造了中國文化強大的融合力,從此中華民族不易崩潰,文化得以延續,皆拜書同文之故(並非語同音)。當今之下,凡是炎黃子孫,均須認識正體字,方得以傳承民族精神,否則視祖宗猶如外族,連族譜都讀不明白,祖父輩名字都念不出來,那就丟人到家了。認識正體字,不是說非要寫,但至少會認,說認不得是講不過去的。

2.我在臺式機上用正體字,在手機時會用簡化字,看到字體,就知道我用什麽上網,手機打字不方便,那時不會說很多話,字體是一種暗示,表明我的狀態。

3.凡是我自己寫的文字,均是此等字體,黏貼的不是,一看就知道。

授人以渔,不授人以鱼。
2015-03-17 20:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
更新
1.修復刪除結點是鏈頭時崩潰的錯誤,即可以刪除鏈頭,轉移下一個元素爲鏈頭
2.刪除結點函數的返回値修改爲返回鏈頭

程序代码:
#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);
    }
}



授人以渔,不授人以鱼。
2015-03-17 23:53
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
以下是引用TonyDeng在2015-3-17 20:06:42的发言:

在這裏順便說一下我的字體問題:

1.正體字是中華民族的傳統字型,秦始皇剿滅六國之後,書同文,鑄造了中國文化強大的融合力,從此中華民族不易崩潰,文化得以延續,皆拜書同文之故(並非語同音)。當今之下,凡是炎黃子孫,均須認識正體字,方得以傳承民族精神,否則視祖宗猶如外族,連族譜都讀不明白,祖父輩名字都念不出來,那就丟人到家了。認識正體字,不是說非要寫,但至少會認,說認不得是講不過去的。

2.我在臺式機上用正體字,在手機時會用簡化字,看到字體,就知道我用什麽上網,手機打字不方便,那時不會說很多話,字體是一種暗示,表明我的狀態。

3.凡是我自己寫的文字,均是此等字體,黏貼的不是,一看就知道。


我在公司用XP有GOOGLE翻譯,所以基本上都會轉簡體,但是在家,因為使用MAC電腦,轉字體麻煩,所以基本上都會用繁體字。
實在很疑惑,你們讀到古文時(文言文),也是都用簡體字嗎?而且古文很多字都是需要用意會才能領略它的意境,實在無法想像簡體字怎讀。
書法也是,簡體字的書法,完全無法想像。

不要選我當版主
2015-03-18 05:42
快速回复:詳解鏈表
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.071335 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved