| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 566 人关注过本帖
标题:链表删除结点函数出了问题 大家帮我看看好吗
只看楼主 加入收藏
boogaloo1c
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-6-30
收藏
 问题点数:0 回复次数:9 
链表删除结点函数出了问题 大家帮我看看好吗
struct message *del(struct message *head)
{
    struct message *p1,*p2;
    int m;
    char name[30];
    if(head==NULL)
 {
     printf("通讯录为空,删除失败!\n");
     return(head);
 }
p1=head;
printf("∞∞∞∞∞∞∞∞∞∞∞∞∞∞\n");
printf("§  请输入需要删除的姓名  §\n");
printf("∞∞∞∞∞∞∞∞∞∞∞∞∞∞\n");
m=0;
gets(name);
     while(p1!=NULL)
     {
      while(strcmp(p1->name,name)!=0&&p1->next!=NULL)
      {
       p2=p1;
       p1=p1->next;
      }
      if(strcmp(p1->name,name)==0)
      {
       m++;
       if(head=p1)
       {
           head=p1->next;
           free(p1);
       }
      else
      {
           if(p1->next=NULL)
           {
               p2->next=NULL;
               free(p1);
           }
           else
           {
               p2->next=p1->next;
               free(p1);
           }
      }
       n=n-1;
          printf("删除成功!\n");
      }
      p1=p1->next;
   
     if(m==0)
     {
      printf("查无此人,删除失败!\n");
     }
     break;
     
  }
return(head);
}
这个函数运行出来是如果删除第二个 那么前两个都删除了 求高手指出错误
搜索更多相关主题的帖子: 姓名 通讯录 message del return 
2011-06-30 21:09
oszc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:111
专家分:154
注 册:2011-4-15
收藏
得分:0 
if(head=p1)  //等于变成赋值了
2011-06-30 21:30
boogaloo1c
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 2楼 oszc
改了 可是还是同样的问题。。。
2011-06-30 21:44
boogaloo1c
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 2楼 oszc
改之后是不论删哪个都是按次序来删除第一个。。。
2011-06-30 21:50
h_mastuade
Rank: 2
等 级:论坛游民
帖 子:21
专家分:86
注 册:2011-6-28
收藏
得分:0 
错误蛮多的  不知从和说起..删除单链表函数很简单的  只要找到节点p,并且记录该节点前驱q  然后让q->next=p->next,再删除p就够了。。
后面好几个if的条件 ==符号写成了=   并且逻辑好像也有问题  貌似对链表结构没搞清楚。把书好好看一下
2011-06-30 21:52
boogaloo1c
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 5楼 h_mastuade
谢谢你啊 我修改之后基本可以正常删除了 但是还是删除不了头结点 麻烦能帮我看一下如何修改才能删除头结点吗?
struct message *del(struct message *head)
{
    struct message *p1,*p2;
    int m;
    char name[30];
    if(head==NULL)
 {
     printf("通讯录为空,删除失败!\n");
     return(head);
 }
p1=head;
printf("∞∞∞∞∞∞∞∞∞∞∞∞∞∞\n");
printf("§  请输入需要删除的姓名  §\n");
printf("∞∞∞∞∞∞∞∞∞∞∞∞∞∞\n");
m=0;
gets(name);
     while(p1!=NULL)
     {
      while(strcmp(p1->name,name)!=0&&p1->next!=NULL)
      {
       p2=p1;
       p1=p1->next;
      }
      if(strcmp(p1->name,name)==0)
      {
       m++;
       p2->next=p1->next;
       free(p1);
       n=n-1;
          printf("删除成功!\n");
      }
      p1=p1->next;
   
     if(m==0)
     {
      printf("查无此人,删除失败!\n");
     }
     break;
     
  }
return(head);
}
2011-06-30 22:17
h_mastuade
Rank: 2
等 级:论坛游民
帖 子:21
专家分:86
注 册:2011-6-28
收藏
得分:0 
第一层while循环是什么意思  只要删除一个节点的话那个while循环根本就没有意义。还有  一般我们所指的链表的头节点是没有数据域的  也就是所应该从head->next开始遍历链表  找到要删除的元素。
2011-06-30 22:26
boogaloo1c
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 7楼 h_mastuade
还是不太明白我们大一学的谭浩强的那本书没有讲到链表的遍历和结点的删除
2011-06-30 22:42
h_mastuade
Rank: 2
等 级:论坛游民
帖 子:21
专家分:86
注 册:2011-6-28
收藏
得分:0 
原来是大一的啊...难怪的。。自己把指针学好一点  以后你们会学关于链表的知识的
我跟你把主要代码写下把。

void Delete(message* &head)  //以引用传值方式,对链表直接操作
{
    message* p1,p2;
    char name[20];
    gets(name);
    p1=head->next;
    p2=head;
    while(p1->next!=NULL&&p1->name!=name){
        p1=p1->next;
        p2=p2->next;
    }
    if(p1->name==name){
        p2->next=p1->next;
        free(p1);
    }
    else printf("没有找到相应的结果...\n");
}

还有些边界条件自己判断下。。
收到的鲜花
  • boogaloo1c2011-06-30 23:32 送鲜花  3朵   附言:好文章
  • boogaloo1c2011-06-30 23:34 送鲜花  3朵  
  • boogaloo1c2011-06-30 23:34 送鲜花  3朵  
  • boogaloo1c2011-06-30 23:34 送鲜花  3朵  
  • boogaloo1c2011-06-30 23:34 送鲜花  3朵  
2011-06-30 23:03
boogaloo1c
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 9楼 h_mastuade
太感谢了 帮了我大忙了 这个论坛就是牛人多
2011-06-30 23:32
快速回复:链表删除结点函数出了问题 大家帮我看看好吗
数据加载中...
 
   



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

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