标题:关于删除链表节点的 看看错在哪里(代码是copy自互联网)
只看楼主
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
结帖率:99.76%
已结贴  问题点数:100 回复次数:21 
关于删除链表节点的 看看错在哪里(代码是copy自互联网)
程序代码:
Node *Delete(Node *head,int key)
{
    Node *node1=head;
    Node *node2=NULL;
    if (head==NULL)
    {
        return NULL;
    }
    else
    {
        if (node1->number==key)
        {
            head=head->next;
            free(node1);
            return head;
        }
        else
        {
            while (node1!=NULL)
            {
                node2=node1;
                node2=node2->next;
                if (node2->number==key)
                {
                   node1->next=node2->next;
                   free(node2);
                   break;
                }
                node1=node1->next;
            }
            return head;
        }
    }
}
搜索更多相关主题的帖子: 互联网 number 
2017-03-14 16:06
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
本来就不熟悉链表  这变量名起的 看着都迷糊  
虽然从网上又找了一款删除单链表的函数版本 并且实验成功  但是自己从头写 还是写不来啊

DO IT YOURSELF !
2017-03-14 16:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:17 
node2=node2->next;
if (node2->number==key) // 此时 node2 可能为 NULL
2017-03-14 16:15
alice_usnet
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:18
帖 子:370
专家分:2020
注 册:2016-3-7
得分:17 
while(node1->next != NULL)O

大概就这样

未佩好剑,转身便已是江湖
2017-03-14 16:16
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用wp231957在2017-3-14 16:10:40的发言:

本来就不熟悉链表  这变量名起的 看着都迷糊  
虽然从网上又找了一款删除单链表的函数版本 并且实验成功  但是自己从头写 还是写不来啊
写得太复杂,我瞎写一个(仅供参考,我连编译都没做)
程序代码:
Node* Delete( Node* head, int key )
{
    Node anchor;
    anchor.next = head;

    for( Node* p=&anchor; p->next; p=p->next )
    {
        if( p->next->number == key )
        {
            Node* tmp = p->next->next;
            free( p->next );
            p->next = tmp;
        }
    }

    return anchor.next;
}

2017-03-14 16:26
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
以下是引用rjsp在2017-3-14 16:15:58的发言:

node2=node2->next;
if (node2->number==key) // 此时 node2 可能为 NULL
不是这样的  
我测试的结果是 她会把我目标的下一个记录给删掉
比如
aa
bb
cc
dd
ee
我想删除 cc  她会删掉dd

稍后我会测试你的代码  谢谢

DO IT YOURSELF !
2017-03-14 16:36
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
回复 5楼 rjsp
你这段代码编译运行都没有问题
程序代码:
typedef struct node
{
    char str[256];
    struct node* next;
}tnode,*pnode;

tnode* delrjsp(tnode* head, char* key )
{
    tnode anchor;
    anchor.next = head;
    for( pnode p=&anchor; p->next; p=p->next )
    {
        if( strcmp(p->next->str,key)==0 )
        {
            pnode tmp = p->next->next;
            free( p->next );
            p->next = tmp;
        }
    }
    return anchor.next;
}

请帮我解释一下 本例子中的node tnode 有啥区别  为啥在网上 有的struct 后面跟一个变量 跟一个指针
而有的啥也没有


[此贴子已经被作者于2017-3-14 16:46编辑过]


DO IT YOURSELF !
2017-03-14 16:43
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:17 
给你个简单的。
你可以尝试自己手动在纸上画一个链表,你就比较清楚了。
我学链表和双链表的时候就这么干的,只是后来被栈给虐了,才发现自己的基础不牢,灰溜溜的滚回来补基础。

用两根指针遍历链表,假设为this和next
this保存当前节点,next指向this->next。
也就是说,你在删除那个节点之前,this->next 应该调整,指向next->next.

程序代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct NODE {
    int Value;
    struct NODE *Next;
}Node; 
void PrintList( Node **RootKP );
int FoundList( Node **RootKP, int value );
void DeleteList( Node *RootP );
void Delet( Node **RootKP, int value );

int FoundList( Node **RootKP, int value )
{
    Node *Temp;
    Node *P;

    while( NULL != ( P = *RootKP ) && value > P->Value )
    {
        if( value == P->Value )
            return 0;
        RootKP = &P->Next;
    }
    
    Temp = (Node *)malloc( sizeof(Node) );
    if( NULL == Temp )
        return 0;
    Temp->Value = value;
    Temp->Next = P;
    *RootKP = Temp;

    return 1;

}

void Delet( Node **RootKP , int value )
{
    Node *P,*TempCell;

    while( NULL != ( P = *RootKP ) && value != P->Value )
        RootKP = &P->Next;

    TempCell = P;
    *RootKP = TempCell->Next;
    free( TempCell );
}

void PrintList( Node **RootKP )
{
    Node *P;

    while( NULL != ( P = *RootKP ) )
    {
        printf("%d\n",P->Value);
        RootKP = &P->Next;
    }
}


void DeleteList( Node *RootP )
{
    Node *Temp, *P;

    Temp = RootP->Next;
    RootP->Next = NULL;

    while( NULL != Temp )
    {
        P = Temp->Next;
        free( Temp );
        Temp = P;
    }
}


[此贴子已经被作者于2017-3-14 17:34编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-14 17:21
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
回复 8楼 renkejun1942
typedef struct NODE {
    int Value;
    struct NODE *Next;
}Node;

这里的NODE Node 有啥区别  后者不写 可否  还有你的函数里怎么那么多二级指针啊

DO IT YOURSELF !
2017-03-14 17:40
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 9楼 wp231957
用二级指针,可以不要返回值。

你说的就是别名啊,用typedef取的别名。

struct NODE 是类型。
Node 是别名。

敲代码的时候,可以少敲几个字符。

我写的最好的就是单链表,我看好多书上还没我写的好。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-14 17:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-475065-1-1.html




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

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