| 网站首页 | 业界新闻 | 群组 | 人才 | 技术文章 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 138 人关注过本帖
标题:删除链表中的头结点删不去!但可以删除其他结点!但整个代码又没有什么问题 ...
只看楼主 收藏
TIMFannie
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2017-10-15
结帖率:100%
  已结贴   问题点数:20  回复次数:7   
删除链表中的头结点删不去!但可以删除其他结点!但整个代码又没有什么问题,怎么回事?
struct word
{char c[20];                                 
struct word *next;
};                              //这里是结构体定义

void del_word(struct word *head,char *w)      //通过这个函数,我要删去结构体的成员c与字符数组相同的结构体
{    int j,b=0;
     struct word *p1,*p2;
     p1=p2=head;
     while(p1!=NULL)
     {
         for(j=0;p1->c[j]!=0;j++)
       {
         if(p1->c[j]!=w[j])break;
         if(p1->c[j+1]==0&&w[j+1]==0&&p1->c[j]==w[j])
         {
         p2->next=p1->next;
         p1=p1->next;
         b=1;
         break;
         }
        }
       if(b==1)b=0;
       else
       {
               p2=p1;
            p1=p1->next;  
           
           }
      
     }
}                               //通过这个函数,我发现如果要删除的成员位于头结点我不能够删掉该结点。但可以删除除头结点外的其他结点,为什么呢?求详解!!!!!
2018-01-09 22:21
TIMFannie
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2017-10-15
  得分:0 
头结点删不去,即使free()了头节点处还是乱码
2018-01-09 22:52
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:78
帖 子:1431
专家分:6232
注 册:2015-3-19
  得分:20 
void del_word(struct word *head,char *w)      //通过这个函数,我要删去结构体的成员c与字符数组相同的结构体
{    int j,b=0;
     struct word *p1,*p2;
     p1=p2=head;
     while(p1!=NULL)
     {
         for(j=0;p1->c[j]!=0;j++)
       {
         if(p1->c[j]!=w[j])break;
         if(p1->c[j+1]==0&&w[j+1]==0&&p1->c[j]==w[j])
         {
         p2->next=p1->next;
         p1=p1->next;

         b=1;
         break;
         }
        }
       if(b==1)b=0;
       else
       {
               p2=p1;
            p1=p1->next;  
           
           }
      
     }
}            
首次判断为相等时,p1和p2为同一节点,红色代码执行结束,p2不变,p1为第2节点
后续判断对首节点么有影响
可改为有返回值的处理,单独处理首元节点
程序代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct word {
    char c[20];                                 
    struct word *next;
};                              //这里是结构体定义
struct word* del_word(struct word *head,char *w){//通过这个函数,我要删去结构体的成员c与字符数组相同的结构体
    struct word *p1,*p2;
    p1=p2=head;
    p1=p1->next;
    while(p1!=NULL){
        if(strcmp(p1->c, w)==0){
            p2->next=p1->next;
            p1=p2->next;
        }else{
            p2=p1;
            p1=p1->next;
        }
    }
    if(strcmp(head->c, w)==0){
        head=head->next;
    }
}


[此贴子已经被作者于2018-1-10 00:04编辑过]


like wind.
2018-01-10 00:03
TIMFannie
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2017-10-15
  得分:0 
回复 3楼 林月儿
奥,首结点那里p1与p2根本没改变head。谢谢姐姐
2018-01-10 00:41
TIMFannie
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2017-10-15
  得分:0 
回复 3楼 林月儿
将函数弄成有返回值就成功了,为什么void就改变不了首结点,不是传了head的地址过去了吗

[此贴子已经被作者于2018-1-10 01:36编辑过]

2018-01-10 00:48
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:123
帖 子:5209
专家分:21944
注 册:2014-5-20
  得分:0 
好象没有free掉节点

struct word *del_word(struct word *head, char *w)
{
    struct word *pre, *next;
    while (head)
    {
        if (strcmp(head->c, w) != 0)
            break;
        else
        {
            next = head->next;
            free(head);
            head = next;
        }
    }
    if (!head)
        return NULL;
    pre = head;
    next = head->next;
    while (next)
    {
        if (strcmp(next->c, w) != 0)
        {
            pre = next;
            next = next->next;
        }
        else
        {
            pre->next = next->next;
            free(next);
            next = pre->next;
        }
    }
    return head;
}
2018-01-10 06:07
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:78
帖 子:1431
专家分:6232
注 册:2015-3-19
  得分:0 
回复 5楼 TIMFannie
自定义函数的head参数地址没变,只是作为局部变量往后走了一个节点。
出来时还是原来的地址,我是这么推测的

like wind.
2018-01-10 07:35
TIMFannie
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2017-10-15
  得分:0 
回复 7楼 林月儿
那我就这么记了,感谢
2018-01-10 12:26







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

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