gpt4 book ai didi

C 编程 链表按字母顺序对名称进行排序

转载 作者:行者123 更新时间:2023-11-30 18:34:55 26 4
gpt4 key购买 nike

整个代码是要求用户输入学生的姓名和分数。除了对列表进行排序之外,所有其他功能都很好。我正在尝试创建一个名为 sortlist() 的函数来排列姓名用户输入名称后,按字母顺序排列在链接列表中。

/*void sortlist(){
char t[25];
struct Node*temp=head;
struct Node*temp1=temp->next;
while(temp!=NULL){
if(strcmp(temp->name,temp1->name)>0){
strcpy(t,temp1->name);
strcpy(temp1->name,temp->name);
strcpy(temp->name,t);
}temp=temp->next;
}
}

这是我的sortlist()函数,一旦我选择情况1,程序就会崩溃。这不是实现它的方法吗?

以下是该程序的完整代码:

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

struct Node {
char name[100];
float marks;
struct Node* next; //next is a pointer that stores the address of the next
node
};
struct Node* head; //head is a pointer that stores the address of first node
void printMenu(); //function that prints the menu of the choices
void Print(); //function that prints the result of ALL the students
void Insert_marks(); //function that insert marks of the students
void Insert_names(); //function that insert the names of the students
void Delete(); //function that delete a particular student
void search(); //function that search ONE student and print his or
// her report
void SaveToFile(); //function that save the data entered in text file
void OpenFile(); //function that read data from the text file
void sortlist();

int main(){
int choice,n;
char strings[25];
char words[25];
head = NULL; // the list is empty now

do{
printMenu();
scanf("%d",&choice);

switch(choice){
case 1:
//Introduce the names of the students
printf("enter the name: \n");
scanf("%s",strings);
Insert_names(strings);
sortlist();
break;
case 2:
// Delete the report for a particular student
printf("enter a position");
scanf("%d",&n);
Delete(n);
break;
case 3:
//Introduce marks for all the students
Insert_marks();
break;
case 4:
// print report for individual student
printf("Enter the name:\n");
scanf("%s",words);
search(words);
break;
case 5:
// print report for all the students
printf("NO\tNames\t\tMarks\n");
Print();
break;
case 6:
//Save the data into a text file
SaveToFile();
break;
case 7:
// read the file
OpenFile();
break;
}
}while(choice!= 8);
}


void Insert_names(char strings[25]){
struct Node*temp= (struct Node*)malloc(sizeof(struct Node)); //creating a
// Node
strcpy(temp->name,strings);
temp->marks=-1;
temp->next=NULL;
if(head == NULL){
head = temp;
return;
}else{
struct Node *p =head;
while(p->next)
p= p->next;
p->next=temp;
}
printf("%s\t%s\n",temp->name,temp->next->name);
}

void Insert_marks(){
float x;
struct Node* temp = head;
while(temp->marks != -1){
temp=temp->next;
}
while(temp != NULL){
printf("enter the marks \n");
scanf("%f",&x);
temp->marks=x;
temp=temp->next;
}
}

void Print(){
struct Node* temp = head;
int i=0;
while(temp!= NULL){
i+=1;
printf("%d\t%s\t\t%f",i,temp->name,temp->marks);
temp=temp->next;
printf("\n");
}
}

void Delete(int n){
struct Node* temp1 = head;
if (n ==1){
head = temp1-> next;
free(temp1);
return;
}
int i;
for (i=0;i<n-2;i++)
temp1 = temp1 ->next;
struct Node* temp2= temp1->next;
temp1->next = temp2-> next;
free(temp2);
}

void sortlist(){
char t[25];
struct Node*temp=head;
struct Node*temp1=temp->next;
while(temp!=NULL){
if(strcmp(temp->name,temp1->name)>0){
strcpy(t,temp1->name);
strcpy(temp1->name,temp->name);
strcpy(temp->name,t);
}
}
}

void search(char words[25]){
struct Node*temp = head;
while(temp!= NULL){
if(strcmpi(temp->name,words)==0){
printf("%s\t%f\n",temp->name,temp->marks);
}
temp=temp->next;
}
}

void SaveToFile(){
FILE* fp;
fp = fopen("studentreport.txt","w");
fprintf(fp,"No\tName\t\tMarks\n");
struct Node* temp = head;
int i=0;
while(temp!= NULL){
i+=1;
fprintf(fp,"%d\t%s\t\t%f",i,temp->name,temp->marks);
fprintf(fp,"\n");
temp=temp->next;
}
fclose(fp);
}

void OpenFile(){
FILE*fopen(),*fp;
int c;
fp = fopen("studentreport.txt","r");
c = getc(fp);
while(c != EOF){
printf("%c",c);
c=getc(fp);
}
fclose(fp);
}

void printMenu(){
printf("1.Introduce Student\n2.Remove student\n3.Introduce marks\n4.Print students report\n5.Print report for all students\n6.Save to file\n7.Retrieve data from file\n8.Exit\n");
}

最佳答案

问题出在这里:

void sortlist(){
char t[25];
struct Node*temp=head;
struct Node*temp1=temp->next;
while(temp!=NULL){
if(strcmp(temp->name,temp1->name)>0){ // NOTICE: Dereference of temp1
strcpy(t,temp1->name);
strcpy(temp1->name,temp->name);
strcpy(temp->name,t);
}
temp=temp->next;
}
}

当列表中只有一个元素时,temp1 为 NULL,并且在进行字符串比较时程序崩溃。

也许你想做:

while(temp1!=NULL){

此外,如果列表为空,您还会遇到问题。这也需要处理。

此外,逻辑似乎是错误的。 temp1 始终相同,因此无法对列表进行排序。

总的来说,我认为更好的方法是将新元素插入到正确的位置,而不是使用排序函数。

关于C 编程 链表按字母顺序对名称进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49351429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com