【发布时间】:2022-01-07 21:41:35
【问题描述】:
所以我的排序功能遇到了一点问题。 虽然它在第二个边缘情况下做它应该做的事情, 元素被交换,然后不断交换回来。
这里的例子发生在 Sven(25) 和 Bob(22) 相遇时。
void sortPerson(person *pers, person* newPerson)
{
if(pers == NULL || pers->next == NULL)
{
printf("List is emtpy");
return;
}
person* tempValue;
person* prev = pers;
person* curr = pers->next;
//person* newValue = pers;
while(prev != NULL && curr != NULL)
{
//first edge case
//adds a new person
if(prev->age < newPerson->age)
{
newPerson->next = prev->next;
prev->next = newPerson;
}
//second edge case
//swapping process when prev age greater than curr age
//forming a decending order of ages
if(prev->age > curr->age)
{
tempValue = prev;
prev = prev->next;
prev->next = tempValue;
printf("\nPerson age: %d\n", tempValue->age);
printf("loop test\n");
printf("%d and %d\n",prev->age, prev->next->age);
}
//third edge case
//if age is the same do nothing
if(prev->age == curr->age)
{
return;
}
prev = prev->next;
curr = curr->next;
}
}
这个函数返回一个新人
person* addPerson( person *newPers ){
return newPers;
}
如果你想自己测试,这里是我的主要内容
int main(){
person* person1 = construct_person("Max", 20);
person* person2 = construct_person("Sven", 25);
person* person3 = construct_person("Bob", 22);
person* person4 = construct_person("John", 23);
person* newPerson = construct_person("Markus", 21);
person1->next = person2;
person2->next = person3;
person3->next = person4;
//person4->next = addPerson(person1, newPerson);
//swapPerson(person1);
sortPerson(person1, addPerson(newPerson));
printperson(person1);
free(person1);
free(person2);
free(person3);
free(person4);
free(newPerson);
}
我的结构人和构造函数
typedef struct person person;
struct person{
char *name;
int age;
person *next;
};
person* construct_person(char *name, int age)
{
person* pers = (person*) malloc (sizeof(person));
pers->name = name;
pers->age = age;
pers->next = NULL;
return pers;
}
我怀疑问题是我的“prev”结构指针在整个过程中被改变了,但我想要第二个意见和潜在的修复。
*注意我只是像这样释放它,因为这只是测试,我不会添加更多的人,否则我会重复这样做。
【问题讨论】:
-
与其交换
prev和curr节点本身,为什么不交换它们的内容(即节点内的数据)? -
因为例如,如果我创建更大的对象,我必须将它们一个一个地切换出来,对吗?例如,如果我有姓名、年龄、地址、身份证等。或者有没有办法捆绑它们?
-
如果从数据中抽象出列表和节点结构,这可能是最简单的。因此,如果一个节点有一个指向
person结构而不是person结构的指针,那将非常简单(简单的初始化和结构对象的分配)。 -
除此之外,我建议您使用调试器逐语句逐句执行代码,同时使用铅笔和纸绘制列表以及您对其执行的操作。使用框作为节点,使用箭头作为指针(包括
next链接)。当您修改指针或链接时,请擦除箭头并重新绘制它。如果你喜欢这样,当你看到纸上的视觉表示时,所做的操作是否有意义?在编写代码之前,使用铅笔和纸也是开始试验的好方法。把它写在纸上,然后翻译成代码。 -
你应该发布
construct_person和person
标签: c list loops struct linked-list