暮若鲸
2021-03-12 09:13
采纳率: 100%
浏览 30

大佬们,这个链表出了什么问题,做课设超级急!

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

typedef struct student
{
    char id[25];
    char name[25];
    int chengji1;
    int chengji2;
    int chengji3;
}stu;

typedef struct tagNode
{
    stu date;
    struct tagNode *next;
}Node;

Node *head=NULL;

void input()//录
{
    Node* NewNode=(Node*)malloc(sizeof(Node));//建立一个结点(人),分配其内存
    NewNode->next=NULL;//指针下一个指向空
    Node* p=head;
scanf("%s %s %d %d %d",NewNode->date.id,NewNode->date.name,&NewNode->date.chengji1,&NewNode->date.chengji2,&NewNode->date.chengji3);

    while(head!=NULL&&p->next!=NULL)
    {
        p=p->next;
    }

    if(head==NULL)
    {
        head->next=NewNode;
    }
    else
    {
        p->next=NewNode;
    }


}

void search()
{
    char num[25];
    scanf("%s",num);
    Node* p=head;
    while(p!=NULL)
    {
        if(strcmp(p->date.id,num)==0)
        {
            printf("%s %s %d %d %d",p->date.id,p->date.name,p->date.chengji1,p->date.chengji2,p->date.chengji3);
            p=NULL;
        }

        else if(p->next!=NULL)
        {
            p=p->next;
        }

        else
        {
            printf("Not Found");
        }
    }
}

int main()
{
    int n,i;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        input();
    }

    search();
}
 

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

1条回答 默认 最新

  • cpp_learner 2021-03-12 09:50
    已采纳

    给你找到问题了。

    问题1:由输入缓冲区引发的输入报错问题。每次输入前清空输入缓冲区即可。

    问题2:scanf("%s %s %d %d %d",NewNode->date.id,NewNode->date.name,&NewNode->date.chengji1,&NewNode->date.chengji2,&NewNode->date.chengji3); 不建议像你这样连着输入,建议分开一个一个的输入。

    问题3:当头等于NULL时,应该将该节点赋值给头,而不是赋值给头的下一个

    if(head==NULL)
    {
       //head->next=NewNode;
         head =  NewNode;    // 当头等于NULL时,应该将该节点赋值给头,而不是赋值给头的下一个。
    }

    除以清空输入缓冲区即可。

    下面是我给你改好的代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include<string.h>
    
    typedef struct student {
    	char id[25];
    	char name[25];
    	int chengji1;
    	int chengji2;
    	int chengji3;
    }stu;
    
    typedef struct tagNode {
    	stu date;
    	struct tagNode *next;
    }Node;
    
    Node *head = NULL;
    
    void input()//录
    {
    	char c;	// 清空输入缓冲区
    	while ((c = getchar()) != '\n');
    
    	Node* NewNode = (Node*)malloc(sizeof(Node));//建立一个结点(人),分配其内存
    	NewNode->next = NULL;//指针下一个指向空
    	Node* p = head;
    	//scanf_s("%s %s %d %d %d", NewNode->date.id, NewNode->date.name, &NewNode->date.chengji1, &NewNode->date.chengji2, &NewNode->date.chengji3);
    	printf("请输入id:");
    	scanf_s("%s", NewNode->date.id, 25);
    	printf("请输入name:");
    	scanf_s("%s", NewNode->date.name, 25);
    	printf("请输入成绩1:");
    	scanf_s("%d", &NewNode->date.chengji1);
    	printf("请输入成绩2:");
    	scanf_s("%d", &NewNode->date.chengji2);
    	printf("请输入成绩3:");
    	scanf_s("%d", &NewNode->date.chengji3);
    	
    
    	while (head != NULL && p->next != NULL) {
    		p = p->next;
    	}
    
    	if (head == NULL) {
    		//head->next = NewNode;	// BUG
    		head = NewNode;
    	} else {
    		p->next = NewNode;
    	}
    
    
    }
    
    void search() {
    	char c;
    	while ((c = getchar()) != '\n');
    
    	char num[25];
    	printf("请输入id:");
    	scanf_s("%s", num, 25);
    	Node* p = head;
    	while (p != NULL) {
    		if (strcmp(p->date.id, num) == 0) {
    			printf("%s %s %d %d %d", p->date.id, p->date.name, p->date.chengji1, p->date.chengji2, p->date.chengji3);
    			p = NULL;
    		}
    
    		else if (p->next != NULL) {
    			p = p->next;
    		}
    
    		else {
    			printf("Not Found");
    		}
    	}
    }
    
    int main() {
    	int n, i;
    	printf("请输入个数:");
    	scanf_s("%d", &n);
    	for (i = 0; i < n; i++) {
    		input();
    	}
    
    	search();
    }

    点赞 1 打赏 评论

相关推荐 更多相似问题