m0_53562251
小小黑¥¥¥
2021-03-15 13:05
采纳率: 90.9%
浏览 73

c语言中怎么插入char name后为什么输出结果会出现乱码。

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct node
{
    int id;//学号
    char name[20];
    int score;//成绩
    struct node *next;
}Lnode,*LinkList;//学生成绩的结构体
LinkList Create_List()//创建成绩单链表
{
    LinkList head=NULL;//第一个结点
    Lnode *p,*last=NULL;//last尾结点
    int id,score;
    char name[20];
    printf("请输入学号,姓名,成绩(用,隔开,0结束):\n");
    scanf("%ld,%s,%d",&id,&name,&score);
    while(id!=0)//学号为0时循环结束
    {
        p=(Lnode *)malloc(sizeof(Lnode));//新建立数据结点
        p->id=id;
        p->name[20]=name[20];
        p->score=score;
        if(head==NULL) head=p;//第一个结点的处理
        else last->next=p;//其他结点的处理
        last=p;//指向新的尾结点
        scanf("%ld,%s,%d",&id,&name,&score);
    }
    if(last!=NULL)
        last->next=NULL;//对于非空表,最后结点的指针域放空指针
    return head;
}
void Disp_List(LinkList head)//显示成绩
{
    LinkList p=head;
    //p=head->next;//读取第一个元素的地址存储位置,就是直接读取下一个位置的元素
    while(p!=NULL)
    {
        printf("学号%ld,%s,%d分→",p->id,p->name,p->score);
        p=p->next;
    }
    printf("NULL\n");
}
void Ins_List(LinkList head,int i,int id,char name[20],int score)//插入操作
{
    int j=0;
    Lnode *h,*p;
    h=(Lnode *)malloc(sizeof(Lnode));//新开辟要插入结点
    h->id=id;
    h->name[20]=name[20];
    h->score=score;
    h->next=NULL;
    p=head;
    while((j<i-1)&&(p->next!=NULL))//寻找前一个位置
    {
        p=p->next;j=j+1;
    }
    if(j==i-1){h->next=p->next;p->next=h;}
    else printf("插入失败!\n");
}
void Del_List(LinkList head,int i)//删除操作
{
    int j=0;
    LinkList p,q;
    p=head;
    while((j<i-1)&&(p->next!=NULL))
    {
        p=p->next;
        j=j+1;
    }
    if((p->next!=NULL)&&(j==i-1))
    {
        q=p->next;
        p->next=q->next;
        free(q);
    }
    else printf("删除失败!");
}
main()
{
    LinkList head;
    int id,i,score;
    char name[20];
    head=Create_List();//创建学生成绩链表
    Disp_List(head);
    printf("------------------------------\n");
    printf("输入要插入的位置,学号,成绩(用,隔开):");
        scanf("%d,%ld,%s,%d",&i,&id,&name,&score);
        Ins_List(head,i,id,name[20],score);//插入操作
        Disp_List(head);
        printf("------------------------------\n");
        printf("请输入要删除信息的位置:");
        scanf("%d",&i);
        Del_List(head,i);//删除操作
        Disp_List(head);
}

 

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • ChengCheng_0211
    ChengCheng_0211 2021-03-15 16:52
    已采纳

    把p->name[20]=name[20];改成strcpy(p->name, name);

    h->name[20]=name[20];改成strcpy(h->name, name);试一试

    点赞 评论
  • azdegdj
    粉墨小克 2021-03-15 14:41

    字符串结束符有没有写进去,粗略看你的代码好像是没有的

    点赞 1 评论
  • cpp_learner
    cpp_learner 2021-03-15 13:52

    输入时应该是name吧,不是&name

    点赞 评论
  • m0_53562251
    小小黑¥¥¥ 2021-03-15 18:53

    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
    typedef struct node
    {
        int id;//学号
        char name[20];
        int score;//成绩
        struct node *next;
    }Lnode,*LinkList;//学生成绩的结构体
    LinkList Create_List()//创建成绩单链表
    {
        LinkList head=NULL;//第一个结点
        Lnode *p,*last=NULL;//last尾结点
        int id,score;
        char name[20]={0};
        printf("请输入学号,姓名,成绩(用,隔开,0结束):\n");
        scanf("%ld,%s,%d",&id,name,&score);
        while(id!=0)//学号为0时循环结束
        {
            p=(Lnode *)malloc(sizeof(Lnode));//新建立数据结点
            p->id=id;
            strcpy(p->name,name);
            p->score=score;
            if(head==NULL) head=p;//第一个结点的处理
            else last->next=p;//其他结点的处理
            last=p;//指向新的尾结点
            scanf("%ld,%s,%d",&id,name,&score);
        }
        if(last!=NULL)
            last->next=NULL;//对于非空表,最后结点的指针域放空指针
        return head;
    }
    void Disp_List(LinkList head)//显示成绩
    {
        LinkList p=head;
        //p=head->next;//读取第一个元素的地址存储位置,就是直接读取下一个位置的元素
        while(p!=NULL)
        {
            printf("学号%ld,%s,%d分→",p->id,p->name,p->score);
            p=p->next;
        }
        printf("NULL\n");
    }
    void Ins_List(LinkList head,int i,int id,char name[20],int score)//插入操作
    {
        int j=0;
        Lnode *h,*p;
        h=(Lnode *)malloc(sizeof(Lnode));//新开辟要插入结点
        h->id=id;
        strcpy(h->name,name);
        h->score=score;
        h->next=NULL;
        p=head;
        while((j<i-1)&&(p->next!=NULL))//寻找前一个位置
        {
            p=p->next;j=j+1;
        }
        if(j==i-1){h->next=p->next;p->next=h;}
        else printf("插入失败!\n");
    }
    void Del_List(LinkList head,int i)//删除操作
    {
        int j=0;
        LinkList p,q;
        p=head;
        while((j<i-1)&&(p->next!=NULL))
        {
            p=p->next;
            j=j+1;
        }
        if((p->next!=NULL)&&(j==i-1))
        {
            q=p->next;
            p->next=q->next;
            free(q);
        }
        else printf("删除失败!");
    }
    main()
    {
        LinkList head;
        int id,i,score;
        char name[20]={0};
        head=Create_List();//创建学生成绩链表
        Disp_List(head);
        printf("------------------------------\n");
        printf("输入要插入的位置,学号,成绩(用,隔开):");
            scanf("%d,%ld,%s,%d",&i,&id,name,&score);
            Ins_List(head,i,id,name[20],score);//插入操作
            Disp_List(head);
            printf("------------------------------\n");
            printf("请输入要删除信息的位置:");
            scanf("%d",&i);
            Del_List(head,i);//删除操作
            Disp_List(head);
    }
    
    点赞 评论

相关推荐