gpt4 book ai didi

c - 按字母顺序排序链表

转载 作者:行者123 更新时间:2023-11-30 16:57:52 26 4
gpt4 key购买 nike

我正在尝试创建一个按字母顺序排序的链接列表。对于代码,如果任何两个名字相同,则比较它们的年龄。假设他们的年龄不会相同。

我创建了一个函数来比较两个学生的姓名和年龄,如 comesBefore 所示。这工作得很好。

我遇到的问题是将四个名称链接在一起时出现段错误。如果有人能给我一些关于我出错的地方或在 c 中调试的指示,那就太好了。

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

typedef struct name_s Name;

//Struct name_s contains a character pointer to a name, an age, and a
// pointer to the next name in a linked list

struct name_s{
char* name;
int age;
Name* next;
};

//comesBefore takes a pointer to student1 and student2.
//The two students are compared to see which one comes first in
//alphabetical order.
//If both names are the same then their ages are compared.
//The function returns true if student1 should come first else false

bool comesBefore(const Name* student1, const Name* student2)
{
int i = 0;
if (student2 == NULL){
return true;
}
while (student1->name[i]!= '\0' && student2->name[i] != '\0'){
if (student1->name[i] < student2->name[i]){
return true;
}
i++;
}

if (student1->name == student2->name){
if (student1->age < student2->age){
return true;
}
}

return false;
}

//creates a linked list in alphabetical order of the names
//if any two names are the same the one with the lowest age comes first

Name* linkedList(Name names[], int n)
{
Name* head = NULL;
Name* previous = NULL;
Name* last = NULL;
Name* current = &names[0];
int i = 0;
while (i < n) {
if (head == NULL){
head = current;
} else {
if (comesBefore(current, head)){
current->next = head;
head = current;
} else {
previous = head;
while(comesBefore(current, previous->next) == false
&& previous->next != NULL){
previous = previous->next;
}

current->next = previous->next;
previous->next = current;
}

}
last = head;
int k = 0;
while (k <= i){
last = last->next;
k++;
}

last->next = NULL;
i++;
current = &names[i];
}


return head;
}


int main(void)
{

Name a;
Name b;
Name c;
Name d;
Name* s1 = &a;
Name* s2 = &b;
Name* s3 = &c;
Name* s4 = &d;

s1->name = "Zaphod Beeblebrox";
s1->age = 250;
s2->name = "Albert Einstein";
s2->age = 133;
s3->name = "Albert Einstein";
s3->age = 7;
s4->name = "Brook Fleming";
s4->age = 20;

Name names[4];
names[0] = a;
names[1] = b;
names[2] = c;
names[3] = d;

Name* list = linkedList(names, 4);
while (list!=NULL){
printf("Name: %s\nAge: %d\n--------\n",
list->name,
list->age
);
list = list->next;
}



return 0;
}

最佳答案

问题是“下一个”指针未初始化。您需要使它们无效。

Name a = {0};
Name b = {0};
Name c = {0};
Name d = {0};

另一件事是,您的排序函数不能很好地处理字符串比较。您应该将其更改为:

bool comesBefore(const Name* student1, const Name* student2)
{
int i = 0;
if (student2 == NULL)
{
return true;
}
while (student1->name[i]!= '\0' && student2->name[i] != '\0')
{
if (student1->name[i] < student2->name[i]){
return true;
}
else if (student1->name[i] > student2->name[i]){
return false;
}

i++;
}
...

或者更好的是,使用strcmp()

另请注意,代码中的整个“k”和“last”部分根本不是必需的

关于c - 按字母顺序排序链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39247627/

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