IT入门小白 2023-10-15 19:35 采纳率: 30.8%
浏览 4

运行结果:运行时插入的关键字没有显示出来,因此按关键字删除也不会删除新添加的数据记录,如何解决?

在链表中插入数据时,有部分数据不显示。
代码如下:

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

typedef struct
{
    char key[10];                        //关键字
    char name[20];
    int age;
}Data;                                    //数据结点类型
typedef struct Node                         //定义链表结构
{
    Data nodeData;
    struct Node*nextNode;
}CLType;

CLType*CLAddEnd(CLType*head,Data nodeData)        //追加结点
{
    CLType*node,*htemp;
    if(!(node=(CLType*)malloc(sizeof(CLType))))
    {
        printf("申请内存失败!\n");
        return NULL;
    }
    else
    {
        node->nodeData=nodeData;              //保存数据
        node->nextNode=NULL;                  //设置结点指针为空,即为表尾
        if(head==NULL)                        //头指针
        {
            head=node;
            return head;
        }
        htemp=head;
        while(htemp->nextNode!=NULL)           //查找链表的末尾
        {
            htemp=htemp->nextNode;
        }
        htemp->nextNode=node;
        return head;
    }
}
CLType*CLAddFirst(CLType*head,Data nodeData)
{
    CLType*node;
    if(!(node=(CLType*)malloc(sizeof(CLType))))
    {
        printf("内存分配失败!\n");
        return NULL;
    }
    else
    {
        node->nodeData=nodeData;
        node->nextNode=head;                         //指向头指针所指结点
        head=node;                                   //头指针指向新增结点
        return head;
    }
}
CLType*CLFindNode(CLType*head,char*key)              //查找结点
{
    CLType*htemp;
    htemp=head;                                  //保存链表头指针
    while(htemp)                                //若结点有效,则进行查找
    {
        if(strcmp(htemp->nodeData.key,key)==0)          //若结点关键字与传入关键字相同
        {
            return htemp;                              //返回该结点指针
        }
        htemp=htemp->nextNode;                          //处理下一个结点
    }
    return NULL;
}
CLType*CLInsertNode(CLType*head,char*findkey,Data nodeData)        //插入结点
{
    CLType*node,*nodetemp;
    if(!(node=(CLType*)malloc(sizeof(CLType))))                    //分配保存结点的内容
    {
        printf("内存分配失败!\n");
        return 0;
    }
    node->nodeData=nodeData;                                 //保存结点中的数据
    nodetemp=CLFindNode(head,findkey);
    if(nodetemp)                                             //若找到要插入的结点
    {
        node->nextNode=nodetemp->nextNode;                   //新插入结点指向关键结点的下一个结点
        nodetemp->nextNode=node;                             //设置关键结点指向新插入结点
    }
    else
    {
        printf("未找到正确的插入位置!\n");
        free(node);                                        //释放内存
    }
    return head;
}
int CLDeleteNode(CLType*head,char*key)
{
    CLType*node,*htemp;                                    //node保存删除结点的前一个结点
    htemp=head;
    node=head;
    while(htemp)
    {
        if(strcmp(htemp->nodeData.key,key)==0)                  //找到关键字,执行删除操作
        {
            node->nextNode=htemp->nextNode;                     //使前一个结点指向当前结点的下一个结点
            free(htemp);                                        //释放内存
            return 1;
        }
        else
        {
           node=htemp;                                         //指向当前结点
           htemp=htemp->nextNode;                               //指向下一个结点
        }
    }
    return 0;                                               //未删除
}
int CLLength(CLType*head)                                        //计算链表长度
{
    CLType*htemp;
    int Len=0;
    htemp=head;
    while(htemp)                                               //遍历整个链表
    {
        Len++;                                                 //累加结点数量
        htemp=htemp->nextNode;                                 //处理下一个结点
    }
    return Len;                                               //返回结点数量
}
void CLAllNode(CLType*head)                                    //遍历链表
{
    CLType*htemp;
    Data nodeData;
    htemp=head;
    printf("当前链表共有%d个结点。链表所有数据如下:\n",CLLength(head));
    while(htemp)                                                  //循环处理链表每个结点
    {
        nodeData=htemp->nodeData;                                    //获取结点数据
        printf("结点(%s,%s,%d)\n",nodeData.key,nodeData.name,nodeData.age);
        htemp=htemp->nextNode;
    }
}

void main()
{
    CLType*node,*head=NULL;
    Data nodeData;
    char key[10],findkey[10];

    printf("链表测试。先输入链表中的数据,格式为:关键字 姓名 年龄\n");
    do
    {
        fflush(stdin);
        scanf("%s",nodeData.key);
        if(strcmp(nodeData.key,"0")==0)
        {
            break; //若输入为0,则退出
        }
        else
        {
            scanf("%s%d",nodeData.name,&nodeData.age);
            head=CLAddEnd(head,nodeData);                    //在链表尾部添加结点
        }
    }while(1);
    CLAllNode(head); //显示所有结点

    printf("\n 演示插入结点,输入插入位置的关键字:");
    fflush(stdin);
    scanf("%s",&findkey);                                   //输入插入位置关键字
    printf("输入插入结点的数据(关键字 姓名 年龄):");
    scanf("%s %s %d",nodeData.key,nodeData.name,&nodeData.age);         //输入插入结点数据
    head=CLInsertNode(head,findkey,nodeData);                                      //调用插入函数
    CLAllNode(head);                                             //显示所有结点

    printf("\n 演示删除结点,输入要删除的关键字:");
    fflush(stdin);
    scanf("%s",key);                                         //输入删除结点的关键字
    CLDeleteNode(head,key);                                  //调用删除结点函数
    CLAllNode(head);

    printf("\n 演示在链表中查找,输入查找关键字:");
    fflush(stdin);
    scanf("%s",key);                                         //输入查找关键字
    node=CLFindNode(head,key);                               //调用查找函数,返回结点指针
    if(node)                                                 //若返回结点指针有效
    {
        nodeData=node->nodeData;
        printf("关键字%s对应的结点为(%s %s %d)\n",key,nodeData.key,nodeData.name,nodeData.age);
    }
    else                                                      //若指针无效
    {
        printf("在链表中未找到关键字为%s的结点!\n",key);
    }

}

运行结果:

img


运行时插入的关键字没有显示出来,因此按关键字删除也不会删除新添加的数据记录。
请问这是什么原因?

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-15 23:08
    关注

    【相关推荐】




    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月15日