| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1245 人关注过本帖
标题:关于通讯录通过名字来删除信息,如果我先删除头节点的信息,就会出问题
只看楼主 加入收藏
GreenhandG
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2015-6-10
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:14 
关于通讯录通过名字来删除信息,如果我先删除头节点的信息,就会出问题
求大神帮忙
void deletbyname(struct telephone* head,char *name)
{
    struct telephone *current;
    struct telephone *pre;
    int p=0;
    current=head;
     if(strcmp(current->name,name)==0)
     {
         head=current->next;
         free(current);
         p=1;
         return;
    }
    while(current!=NULL)
    {
        if(strcmp(current->name,name)==0)
        {
            pre->next=current->next;
            free(current);
            p=1;
            break;
        }
        pre=current;
        current=current->next;
    }
    if(p==0)
        printf("查无此人\n");

[ 本帖最后由 GreenhandG 于 2015-6-22 15:28 编辑 ]
搜索更多相关主题的帖子: current return 通讯录 信息 telephone 
2015-06-22 15:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
刪頭結點,把後面那個挪作頭。

授人以渔,不授人以鱼。
2015-06-22 16:08
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
https://bbs.bccn.net/thread-442722-1-2.html
刪除頭結點的示例在19樓

[ 本帖最后由 TonyDeng 于 2015-6-22 17:06 编辑 ]

授人以渔,不授人以鱼。
2015-06-22 16:17
GreenhandG
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2015-6-10
收藏
得分:0 
回复 3楼 TonyDeng
thank you 看完后有帮助,就是不懂为啥要用Note **head做为参数,忘大神赐教
2015-06-22 17:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用GreenhandG在2015-6-22 17:28:17的发言:

thank you 看完后有帮助,就是不懂为啥要用Note **head做为参数,忘大神赐教

那是用於修改參數的値,你看調用部分的代碼,是用&取頭結點head的地址,這與普通的指針傳參修改參數返回是一樣的道理。由於head本身是T*的,所以它的地址聲明是**T。

Node* node = linkHead;                        && 鏈頭的聲明
DeleteNode(&node, node->Next);                && 取鏈頭的地址傳參

Node* DeleteNode(Node** head, Node* node);    && 刪除函數的形參聲明是node的地址
由於需要返回修改後正確的鏈頭,即形參head可能已被修改,故不能直接返回傳入的那個位置,必須返回修改後的新鏈頭地址。當刪除的結點不是鏈頭,兩者是同一個頭結點,但若刪的是頭結點,那麽返回的就是原先鏈頭後面那個結點,它將被視爲新的鏈頭——原有的鏈頭結點已在函數内部釋放掉。

[ 本帖最后由 TonyDeng 于 2015-6-22 17:44 编辑 ]

授人以渔,不授人以鱼。
2015-06-22 17:35
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
所謂的鏈頭,其實是從哪個結點開始檢索的入口稱呼,並非一定要是鏈的最開頭,對一個閉環鏈結構,是無所謂頭與尾的,但它卻仍然是鏈表。刪除一個結點,現實中也未必總需要把結點佔用的空間釋放掉,衹要把挂鈎改變即可,在適當的時候,數據還可以插回來,或鏈到任意新的位置去,這也是鏈表排序的原理。

授人以渔,不授人以鱼。
2015-06-22 17:50
GreenhandG
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2015-6-10
收藏
得分:0 
回复 5楼 TonyDeng
在main中已经声明了一个指向结构体的指针 Node*linkhand     假设我定义的一个函数delet(node*head,....) 我只需要把main中的linkhand传给它不就行了么,这样delet中也能找到链表的头节点,为啥还要多此一举用用**head   我是大一的学生,刚学c不久,望大神耐心指教
2015-06-22 17:59
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用GreenhandG在2015-6-22 17:59:41的发言:

在main中已经声明了一个指向结构体的指针 Node*linkhand     假设我定义的一个函数delet(node*head,....) 我只需要把main中的linkhand传给它不就行了么,这样delet中也能找到链表的头节点,为啥还要多此一举用用**head   我是大一的学生,刚学c不久,望大神耐心指教


函數除了要知道鏈頭,還要知道到底要刪哪一個結點,所以是兩個參數。第一個參數是鏈頭,第二個參數是需要刪除的結點。

授人以渔,不授人以鱼。
2015-06-22 18:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你測試一下我11樓修改前的代碼,就明白爲什麽要兼容刪除鏈頭時,把代碼改成19樓那樣。要測試一個函數是否寫好,須用各種特殊情形試用,在這裏,要測試刪除中間、開頭、結尾三種情形,要確保同一個函數在這三種情形下均能運行正確而無須再修改代碼。

[ 本帖最后由 TonyDeng 于 2015-6-22 18:11 编辑 ]

授人以渔,不授人以鱼。
2015-06-22 18:08
GreenhandG
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2015-6-10
收藏
得分:0 
回复 9楼 TonyDeng
嗯,谢谢!我试试
2015-06-22 18:10
快速回复:关于通讯录通过名字来删除信息,如果我先删除头节点的信息,就会出问题 ...
数据加载中...
 
   



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

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