标题:关于删除链表节点的 看看错在哪里(代码是copy自互联网)
只看楼主
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
以下是引用renkejun1942在2017-3-14 17:44:02的发言:

用二级指针,可以不要返回值。
 
你说的就是别名啊,用typedef取的别名。
 
struct NODE 是类型。
Node 是别名。
 
敲代码的时候,可以少敲几个字符。
 
我写的最好的就是单链表,我看好多书上还没我写的好。
  就是说 应该 struct NODE xxx  那么 Node xxx 就可以了

DO IT YOURSELF !
2017-03-14 17:46
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 11楼 wp231957
是的。

新建结构模板的时候,标识符和别名都可以不写,但是标识符不写,会很蛋疼。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-14 17:47
mnmn4429
Rank: 4
等 级:业余侠客
帖 子:64
专家分:245
注 册:2017-2-21
得分:17 
指针那儿问题
 while (node1!=NULL)
            {
                node2=node1;
                node2=node2->next;
                if (node2->number==key)
                {
                   node1->next=node2->next;
                   free(node2);
                   break;
                }
                node1=node1->next;
            }
看这段代码, node2=node1;
            node2=node2->next;
现在的node2是下一个,而你想删这个所以删错了
你可以把 if (node2->number==key)
改成if(node1->number == key)
真是看得人蛋疼

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

2017-03-14 17:47
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
回复 13楼 mnmn4429
不行 改完 还是原来的结果  删除目标节点的下一个节点数据 代码
程序代码:
typedef struct node
{
    char str[256];
    struct node* next;
}tnode,*pnode;


tnode *delw(tnode *head,char* key)
{
    struct node *node1=head;
    struct node *node2=NULL;
    if (head==NULL)
    {
        return NULL;
    }
    else
    {
        if (strcmp(node1->str,key)==0)
        {
            head=head->next;
            free(node1);
            return head;
        }
        else
        {
            while (node1!=NULL)
            {
                node2=node1;
                node2=node2->next;
                if (strcmp(node1->str,key)==0)
                {
                   node1->next=node2->next;
                   free(node2);
                   break;
                }
                node1=node1->next;
            }
            return head;
        }
    }
}


DO IT YOURSELF !
2017-03-14 18:08
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
得分:17 
13楼说的不对,
程序代码:
        else
        {
            while (node1->next!=NULL)
            {
                node2=node1;
                node2=node2->next;
                if (strcmp(node2->str,key)==0)
                {
                   node1->next=node2->next;
                   free(node2);
                   break;
                }
                node1=node1->next;
            }
            return head;
        }


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


早知做人那么辛苦!  当初不应该下凡
2017-03-14 18:33
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:17 
受到六楼的启发~送上基本的链表操作代码~可以参考一下~

程序代码:
#include<stdio.h>
#include<stdlib.h>

#define LEN sizeof (Node)

typedef struct Node
{
    int n;
    struct Node* next;
}Node;

Node* creat(Node* head);
void print(Node* head);
Node* del(Node* head,int key);
Node* insert(Node* head,int key,int s);
Node* find(Node* head,int key);
Node* sort(Node* head);

int main()
{
    Node* head=NULL;

    head=creat(head);
    print(head);

    head=sort(head);
    print(head);

    return 0;
}

Node* creat(Node* head)
{
    int a=0;

    Node tnode={0};
    Node* p=&tnode;
    tnode.next=head;

    scanf("%d",&a);

    while (p->next)
        p=p->next;

    while (a)
    {
        p=p->next=(Node* )malloc(LEN);
        p->n=a;
        p->next=NULL;
        scanf("%d",&a);
    }

    return tnode.next;
}

void print(Node* head)
{
    Node tnode={0};
    Node* p=&tnode;
    tnode.next=head;

    while (p=p->next)
        printf("%d ",p->n);

    puts("");
} 

Node* del(Node* head,int key)
{
    Node tnode={0};
    Node* p=&tnode;
    tnode.next=head;

    while (p->next)
        if (p->next->n==key)
        {
            Node* tmp=p->next->next;
            free(p->next);
            p->next=tmp;
        }
        else 
            p=p->next;

    return tnode.next;
}

Node* insert(Node* head,int key,int s)
{
    Node tnode={0};
    Node* p=&tnode;
    tnode.next=head;

    while (p->next)
        if (p->next->n==key)
        {
            Node* tem=(Node* )malloc(LEN);
            tem->next=p->next;
            tem->n=s;
            p->next=tem;
            break;
        }
        else
            p=p->next;

    return tnode.next;
}

Node* find(Node* head,int key)
{
    Node tnode={0};
    Node* p=&tnode;
    tnode.next=head;

    while (p->next)
        if (p->next->n==key)
            return p->next;
        else
            p=p->next;

    return NULL;
}

Node* sort(Node* head)
{
    Node tnode={0};
    Node* p=&tnode;
    tnode.next=head;

    while (p->next)
    {
        Node* pt=p;

        while (pt->next)
            if (pt->next->n<p->next->n)
            {
                Node* tmp=pt->next->next;
                pt->next->next=p->next;
                p->next=pt->next;
                pt->next=tmp;
            }
            else
                pt=pt->next;

        p=p->next;
        
    }
    return tnode.next;
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-14 20:37
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
有一个疑问啊
Node* tmp=p->next->next;
咋来这么多next呢  那是不是 Node* tmp=p->next->next->next->next 都可以啊

DO IT YOURSELF !
2017-03-14 21:26
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
以下是引用炎天在2017-3-14 18:33:13的发言:

13楼说的不对,
        else
        {
            while (node1->next!=NULL)
            {
                node2=node1;
                node2=node2->next;
                if (strcmp(node2->str,key)==0)
                {
                   node1->next=node2->next;
                   free(node2);
                   break;
                }
                node1=node1->next;
            }
            return head;
        }
这个对  能正确删除

DO IT YOURSELF !
2017-03-14 21:28
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 17楼 wp231957
只要保证node->next不为NULL理论上后面跟多少个next都可以~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-14 21:39
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
突然想到了如果在创建链表的时候在head前再加个不存放数据的缓冲头结点这样链表操作就会变得简单很多~因为可以忽略头节点插入删除变动影响的问题~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-14 21:53



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




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

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