所以我有一个包含两个元素的链表,一个读入的3个字符的字符串和一个整数值。我需要按照各自的int值以递减的方式对字符串进行排序。我会链接整个代码块,然后指出我遇到的确切位置。
代码运行正常,直到它命中sort()函数。然后它陷入了一些无限循环。当用户输入字符串为“结束”时,程序应该结束。
void sort() {
struct node *ptr1, *ptr2;
ptr1 = ptr2 = head;
while(ptr1 != NULL){
ptr2 = ptr1;
while(ptr2 != NULL) {
if(ptr1->val < ptr2->val){
ptr2 = ptr2->next;
}
}
}
}
int main(void) {
char str[CMDSIZE];
head = NULL;
struct node *temp;
int randomnumber;
randomnumber = (rand() % 10) + 1;
while(strcmp(str, "end") != 0) {
printf("Enter your command: ");
fflush(stdout);
scanf("%[^\n]%*c", str);
insert(str, randomnumber);
randomnumber = (rand() % 10) + 1;
}
sort();
print();
}
以下完整代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define CMDSIZE 4
struct node
{
char cmd[4];
int val;
struct node *next;
};
struct node *head = NULL;
struct node *curr = NULL;
void insert(char command[], int x) {
struct node *temp;
temp = (struct node*)malloc(sizeof(struct node));
strcpy(temp->cmd, command);
temp->val = x;
temp->next = head;
head = temp;
}
void print() {
struct node *temp;
temp = head;
printf("\n Linked List Contents : \n");
while(temp!=NULL){
printf(" Node contains :\n %s %d \n", temp->cmd, temp->val);
temp=temp->next;
}
}
void sort() {
struct node *ptr1, *ptr2;
ptr1 = ptr2 = head;
while(ptr1 != NULL){
ptr2 = ptr1;
while(ptr2 != NULL) {
if(ptr1->val < ptr2->val){
ptr2 = ptr2->next;
}
}
}
}
int main(void) {
char str[CMDSIZE];
head = NULL;
struct node *temp;
int randomnumber;
randomnumber = (rand() % 10) + 1;
while(strcmp(str, "end") != 0) {
printf("Enter your command: ");
fflush(stdout);
scanf("%[^\n]%*c", str);
insert(str, randomnumber);
randomnumber = (rand() % 10) + 1;
}
sort();
print();
}
我使用随机的3个字符串作为输入,直到我输入&#39; end&#39;并且sort函数运行。
使用sort()输出:
Enter your command: lll
Enter your command: ooo
Enter your command: man
Enter your command: bmi
Enter your command: end
没有sort()的输出:
Linked List Contents :
Node contains :
end 9
Node contains :
two 4
Node contains :
one 10
Node contains :
lll 8
答案 0 :(得分:0)
在这个循环中
while(ptr2 != NULL) {
if(ptr1->val < ptr2->val){
ptr2 = ptr2->next;
}
}
如果循环的下一次迭代不会更改ptr2->val >= ptr1->val
ptr2
,这意味着循环永远不会终止。
答案 1 :(得分:0)
看起来您的排序例程并非接近完成。
这两个循环都有可能永远运行。对于外部的,你永远不会改变ptr1的值,所以它永远不会结束 - 内部的只会在某些情况下改变ptr2。
最终,函数内部的任何内容实际上都不会改变列表的顺序,所以我不确定为什么你认为它已经准备就绪了。
答案 2 :(得分:0)
进行排序的一种简单方法是从原始列表中删除节点,然后将它们按顺序插入到最初为空的列表中。由于这可能是功课,我无法提供完整的答案,所以这里有基本的想法:
struct node *sorted = NULL; // initially empty list
// ... remove nodes from head, insert nodes in order into sorted