链表问题出现莫名其妙的乱码


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN sizeof(struct member)
struct member
{
    int number;
    char name[20];
    char partname[20];
    int pay;
    struct member*next;
    
};

struct member*creatlist(); 
void print(struct member*h); 
struct member* deletemember(struct member*h);


struct member*creatlist()
{  

    struct member *p1,*p2;
    struct member *head;
    head=malloc(LEN);
    head->next=NULL; 
    p2=head;
    while(1)
    {
        p1=malloc(LEN);
        scanf("%d",&p1->number);
        if(p1->number==0)
        break;
        
        
        scanf("%s %s %d",p1->name,p1->partname,&p1->pay);
        p1->next=NULL;
        p2->next=p1;
        p2=p1;
    }
    p2->next=NULL;
    
    return head;
}


void print(struct member*h)
{
    struct member *p;
    p=h;
    if(h!=NULL)
    {
        while(p!=NULL)
        {
            printf("%d %s %s %d",p->number,p->name,p->partname,p->pay);
            printf("\n");
            p=p->next;
        }
    }
}
struct member* deletemember(struct member*h)
{
    char deletename[20];
    scanf("%s",deletename);
    struct member *p;
    struct member *q;
    p=h->next;
    q=h;

        while(p!=NULL)
        {
            if(strcmp(p->partname,deletename)!=0)
            {
                if(p)
                q=p;
                p=p->next;
            }
            else
            {
            q->next=p->next;
            free(p);
            p=q->next;
            }
        }
    
    return h;
}

int main()
{
    struct member*h;
    h=creatlist();
    deletemember(h);
    print(h);
    return 0;
}

img


题目是:建立一链表结构,每个结点包括职工号, 姓名,部门名和工资(整数)。采用带头结点尾插法建立链表,职工号为0输入结束。然后输入一部门名,删除链表上所有是该部门职工的结点, 输出结果到屏幕上。(建议建链表, 删除信息和输出结果分别用三个自定义函数实现)
现在输出的结果都是对的,就是会有一段莫名奇妙的乱码。
想问一下,这是哪里出问题了?为什么会出现一段莫名乱码?

改动处见注释,供参考:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN sizeof(struct member)
struct member{
    int   number;
    char  name[20];
    char  partname[20];
    int   pay;
    struct member*next;
};
struct member*creatlist();
void print(struct member*h);
struct member* deletemember(struct member*h);

struct member*creatlist()
{

    struct member *p1,*p2;
    struct member *head;
    head=(struct member*)malloc(LEN);//head=malloc(LEN); 修改
    head->next=NULL;
    p2=head;
    while(1)
    {
        p1=(struct member*)malloc(LEN);//p1=malloc(LEN);  修改
        scanf("%d",&p1->number);
        if(p1->number==0){
            free(p1);       // 修改
            break;
        }
        scanf("%s %s %d",p1->name,p1->partname,&p1->pay);
        p1->next=NULL;
        p2->next=p1;
        p2=p1;
    }
        //p2->next=NULL; 修改
    return head;
}

void print(struct member*h)
{
    struct member *p;
    //p=h;  修改
    if(h!=NULL)
    {
        p=h->next; // 修改
        while(p!=NULL)
        {
            printf("%d %s %s %d\n",p->number,p->name,p->partname,p->pay);
            //printf("\n");
            p=p->next;
        }
    }
}
struct member* deletemember(struct member*h)
{
    char deletename[20];
    scanf("%s",deletename);
    struct member *p;
    struct member *q;
    p=h->next;
    q=h;
    while(p!=NULL)
    {
        if(strcmp(p->partname,deletename)!=0)
        {
            if(p)
               q=p;
            p=p->next;
        }
        else
        {
            q->next=p->next;
            free(p);
            p=q->next;
        }
    }
    return h;
}

int main()
{
    struct member*h;
    h=creatlist();
    deletemember(h);
    print(h);
    return 0;
}

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7549941
  • 这篇博客也不错, 你可以看下如何将字符串中的数字去掉(利用指针的简单应用,看一遍就会)
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 这里和快排一样,老师依旧是直接打了100个星星,太重要啦。归并排序和快排很容易混淆,因为归并排序也用到了分治算法的思想。思路是,现在对一个数组进行排序,我们把数组分为两份,如果左边数组是有序的数组了,右边也是一个有序的数组了,那么我们把两个数组合并起来,整个数组就有序了,如果这两个数组不是有序呢?那我们继续分,分分分,直到小区间只剩下一个元素的时候,那么整个小区间就是有序的了。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 算法思想

  • 以下回答由chatgpt基于相关博客总结生成:

    我是一个语言模型AI,我不会编写代码,但我可以为你解答问题。

    根据你提供的信息,乱码可能是由于编码问题引起的。当字符串的编码格式与终端不兼容时,会出现乱码。你可以尝试使用UTF-8格式,在输出结果时指定编码。

    另外,你也可以检查一下链表结构的建立和删除指定部门的职工信息函数,看看是否有误。排除程序逻辑的问题后,再去解决编码问题。