鱼C论坛

 找回密码
 立即注册
查看: 482|回复: 2

[已解决]单链表删除环节问题求指点

[复制链接]
发表于 2020-4-8 13:39:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Phone
{
        char name[20];
        char num[20];
        struct Phone *next;
};

void addpeople(struct Phone **people);
void Inputpeople(struct Phone *people);
void updatepeople(struct Phone *people);
void delpeople(struct Phone **people);
void browse(struct Phone *people);
void release(struct Phone **people);
void meau();

void Inputpeople(struct Phone *buffer)
{
        printf("请输入姓名:");
        scanf("%s", buffer->name);
        printf("请输入电话号码:");
        scanf("%s", buffer->num);        
}

void addpeople(struct Phone **people)
{
        struct Phone *buffer, *temp;
       
        buffer = (struct Phone *)malloc(sizeof(struct Phone));
        if(buffer == NULL)
        {
                printf("申请内存失败!\n");
                exit(1);
         }
       
        Inputpeople(buffer);
       
        if(people != NULL)
        {
                temp = *people;
                *people = buffer;
                 buffer->next = temp;
        }
        else
        {
                *people = buffer;
                buffer->next = NULL;
        }
}

void update(struct Phone *people)
{
        char ch[20];
        printf("请输入要修改的人的姓名:");
        scanf("%s", ch);
        while(people != NULL)
        {
                if(strcmp(ch, people->name) == 0)
                {
                        printf("请输入要修改的电话号码:");
                        scanf("%s", people->num);       
                }
                people = people->next;
        }
}

void delpeople(struct Phone **people)
{
        struct Phone *temp;
        char ch[20];
        printf("请输入要删除的联系人:");
        scanf("%s", ch);
        fflush(stdin);
       
        while(*people != NULL)
        {
                temp = *people;
                *people = (*people)->next;
                if(strcmp(ch, temp->name) == 0)
                {
                         free(temp);
                         break;
                }
        }
}

void browse(struct Phone *people)
{
        printf("\nname\t    num\n");
        while(people != NULL)
        {
                printf("%s\t%s\n", people->name, people->num);
                people = people->next;
        }
}

void release(struct Phone **people)
{
        struct Phone *temp;
        while(*people != NULL)
        {
                temp = *people;
                *people = (*people)->next;
                free(temp);
        }
}

void meau()
{
        printf("         ------------meau----------\n");
        printf("         |  1-add  2-del           |\n");
        printf("         |  3-update 4-browse 5-out|\n");
        printf("         ---------------------------\n\n");
}
int main(void)
{
        struct Phone *people = NULL;
       
        int op;
       
        meau();
       
        do
        {
                scanf("%d", &op);
                switch(op)
                {
                        case 1 : addpeople(&people);break;
                        case 2 : delpeople(&people);break;
                        case 3 : update(people);break;
                        case 4 : browse(people);break;
                        case 5 : exit(1);
                }
        //        meau();
        }while(op != 0);
       
        release(&people);
       
        return 0;
}

为什么删除不了第一个输入的节点(在次函数void delpeople()),单个上传总是失败,求指点
最佳答案
2020-4-8 14:13:17
你的链表节点删除操作不对啊。
应该先找到节点,然后把节点从链表中拿出来,最后再free该节点。
你的程序没有把该节点从链表中剔除啊。
  1. void delpeople(struct Phone **people)
  2. {
  3.     struct Phone *pb,*pf;
  4.     char ch[20];
  5.     printf("请输入要删除的联系人:");
  6.     scanf("%s", ch);
  7.     fflush(stdin);
  8.     pb=*people;//让pb指向头节点
  9.     if(*people == NULL)//链表为空链表
  10.     {
  11.         printf("链表为空\n");
  12.         return ;
  13.     }
  14.     while(strcmp(ch, pb->name) && pb->next!=NULL)//循环查找要删除的节点
  15.     {
  16.         pf=pb;
  17.         pb=pb->next;
  18.     }
  19.     if(strcmp(ch, pb->name) == 0)//找到了一个节点的name和ch相等
  20.     {
  21.         if(pb == *people)//找到的节点是头节点
  22.             *people = pb->next;
  23.         else//找到的节点是普通节点
  24.             pf->next = pb->next;
  25.         free(pb);
  26.     }
  27.     else//没有找到咱们要删除的节点
  28.         printf("没有找到您要删除的节点\n");
  29. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-8 14:13:17 | 显示全部楼层    本楼为最佳答案   
你的链表节点删除操作不对啊。
应该先找到节点,然后把节点从链表中拿出来,最后再free该节点。
你的程序没有把该节点从链表中剔除啊。
  1. void delpeople(struct Phone **people)
  2. {
  3.     struct Phone *pb,*pf;
  4.     char ch[20];
  5.     printf("请输入要删除的联系人:");
  6.     scanf("%s", ch);
  7.     fflush(stdin);
  8.     pb=*people;//让pb指向头节点
  9.     if(*people == NULL)//链表为空链表
  10.     {
  11.         printf("链表为空\n");
  12.         return ;
  13.     }
  14.     while(strcmp(ch, pb->name) && pb->next!=NULL)//循环查找要删除的节点
  15.     {
  16.         pf=pb;
  17.         pb=pb->next;
  18.     }
  19.     if(strcmp(ch, pb->name) == 0)//找到了一个节点的name和ch相等
  20.     {
  21.         if(pb == *people)//找到的节点是头节点
  22.             *people = pb->next;
  23.         else//找到的节点是普通节点
  24.             pf->next = pb->next;
  25.         free(pb);
  26.     }
  27.     else//没有找到咱们要删除的节点
  28.         printf("没有找到您要删除的节点\n");
  29. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-8 14:23:17 | 显示全部楼层
sunrise085 发表于 2020-4-8 14:13
你的链表节点删除操作不对啊。
应该先找到节点,然后把节点从链表中拿出来,最后再free该节点。
你的程序 ...

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-8 13:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表