瞬身李子啊 2022-04-16 17:06 采纳率: 77.8%
浏览 27
已结题

自己写的链表,不知道哪里出的问题。

头文件已经省略,运行总是主函数的循环出问题,不知道哪里的原因,请求指点。
struct Node
{

int h;
char name[10]; 
int score;
struct Node *next;

};
typedef struct Node NODE;
//链表结构体创建部分
NODE *Creat_Link(nmb)
{
int i=0;
NODE *heat,*tall,*pwne;
heat=(NODE *)malloc(sizeof(NODE));
if(heat==NULL)
{
printf("地址分配错误\n");
return(NULL);
}
heat->next=NULL;
tall=heat;
for(i=0;i<nmb;i++)
{
pwne=(NODE *)malloc(sizeof(NODE));
if(pwne==NULL)
{
printf("地址分配错误\n");
return(NULL);
}
scanf("%d%s%d",&(pwne->h),(pwne->name),&(pwne->score));
pwne->next=NULL;
tall->next=pwne;
tall=pwne;

 }
return heat;

}

//链表创建部分
void Print_Link(NODE* heat)
{
NODE* p=heat;
printf("输出结果为:\n");
printf("学号 姓名 分数\n");
while(p->next!=NULL)
{
p=p->next;
printf(" %d ",p->h);
printf(" %s ",p->name);
printf(" %d\n",p->score);

}

}

//链表打印部分
NODE ChaR(NODE heat,int h)
{
int i=0;
NODE* p=heat;
NODE tall;
NODE
q;
NODE NeN=(NODE)malloc(sizeof(NODE));
NeN->next=NULL;
printf("插入元素为:\n");
scanf("%d%d",&(NeN->h),(NeN->name),&(NeN->score));
for(i=0;i<h;i++)
{
p=p->next;
}
q->next=p->next;
tall=p;
tall->next=NeN;
tall=NeN;
NeN->next=q->next;

}
//链表插入部分

void Dele_Link(NODE* heat,int a)
{
int i=0;
NODE* p=heat;
NODE* q;
NODE* w;
for(i = 1;i < a-1;i++)
{
p=p->next;
}
q=p;
p=p->next;
w=p->next;

q->next=w;

}

int main()
{
NODE* heat;
int nub;
int a=1;
int h;
printf("输入链表数为:\n");
scanf("%d",&nub);
printf("请输入链表元素,包括学号和分数\n");
heat = Creat_Link(nub);

Print_Link(heat);
while(a)
{
printf("是否插入元素或者删除某个元素,添加元素填'1',删除元素填'2',都不则填入'0'.\n"); 
scanf("%d",&a);
if(a==1)
{

    printf("插入元素在哪一位的后边:\n");
    scanf("%d",&h);
    ChaR(heat,h);
}
else if(a==2)
{
    printf("请输入要删除的结点:\n");
    scanf("%d",&h);
    Dele_Link(heat,h);
}

Print_Link(heat);
else
break;
}
return 0;

}

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-04-16 23:08
    关注

    修改处见注释,供参考:

    #include <stdio.h>
    #include <stdlib.h>
    struct Node
    {
        int  h;
        char name[10];
        int  score;
        struct Node *next;
    };
    typedef struct Node NODE;
    //链表结构体创建部分
    NODE *Creat_Link(int nmb) //NODE *Creat_Link(nmb) 修改
    {
        int i=0;
        NODE *heat,*tall,*pwne;
        heat=(NODE *)malloc(sizeof(NODE));
        if(heat==NULL)
        {
           printf("地址分配错误\n");
           return(NULL);
        }
        heat->next=NULL;
        tall=heat;
        for(i=0;i<nmb;i++)
        {
            pwne=(NODE *)malloc(sizeof(NODE));
            if(pwne==NULL)
            {
               printf("地址分配错误\n");
               return(NULL);
            }
            scanf("%d%s%d",&pwne->h,pwne->name,&pwne->score); //修改
            //scanf("%d%s%d",&(pwne->h),(pwne->name),&(pwne->score));
            pwne->next=NULL;
            tall->next=pwne;
            tall=pwne;
        }
        return heat;
    }//链表创建部分
    
    
    void Print_Link(NODE* heat) //链表打印部分
    {
        NODE* p=heat;
        printf("输出结果为:\n");
        printf("学号 姓名 分数\n");
        while(p->next!=NULL)
        {
            p=p->next;
            printf(" %d ",p->h);
            printf(" %s ",p->name);
            printf(" %d\n",p->score);
        }
    }
    
    
    void ChaR(NODE* heat,int h) //链表插入部分
    //NODE ChaR(NODE* heat,int h)  修改
    {
        int i=0;
        NODE* p=heat;
                               // NODE* tall; 修改
                               // NODE* q;    修改
        if (h < 1)  return;
        NODE* NeN=(NODE*)malloc(sizeof(NODE));
        NeN->next=NULL;
        printf("插入元素为(学号 姓名 成绩):\n");
        scanf("%d%s%d",&NeN->h,NeN->name,&NeN->score); //修改
        //scanf("%d%d",&(NeN->h),(NeN->name),&(NeN->score));
        for(i=0;p->next && i < h;i++) //修改
        //for(i=0;i<h;i++)
        {
            p=p->next;
        }
        //q = p->next;  修改
        //tall=p;       修改
        //tall->next=NeN;修改
        //tall=NeN;      修改
        if (p->next != NULL){
            NeN->next=p->next;//修改
        }
        p->next = NeN;    //修改
    }
    
    
    void Dele_Link(NODE* heat,int a) //删除链表
    {
        int i=0;
        NODE* p=heat;
        NODE* q;
                      //NODE* w; 修改
        if (a < 1)  return;
        for(i = 0;p->next && i < a - 1;i++) //修改
        //for(i = 1;i < a-1;i++)
        {
           p=p->next;
        }
        //q=p;          //修改
        if (!p->next) return; //修改
        q = p->next;
        p->next = q->next;//修改
        //q->next=w;   //修改
        free(q);       //修改
    }
    
    int main()
    {
        NODE* heat;
        int nub;
        int a=1;
        int h;
        printf("输入链表数为:\n");
        scanf("%d",&nub);
        printf("请输入链表元素,包括学号 姓名 分数\n");
        heat = Creat_Link(nub);
    
        Print_Link(heat);
        while(a)
        {
            printf("是否插入元素或者删除某个元素,添加元素填'1',删除元素填'2',都不则填入'0'.\n");
            scanf("%d",&a);
            if(a==1)
            {
                printf("输入插入元素的位置:\n"); //修改
                scanf("%d",&h);
                ChaR(heat,h);
            }
            else if(a==2)
            {
                printf("请输入要删除的结点位置:\n"); //修改
                scanf("%d",&h);
                Dele_Link(heat,h);
            }
            Print_Link(heat);
            //else        修改
            //break;      修改
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏

报告相同问题?

问题事件

  • 系统已结题 4月25日
  • 已采纳回答 4月17日
  • 创建了问题 4月16日

悬赏问题

  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用