C中链表的降序排序功能?

时间:2017-03-22 17:20:20

标签: c sorting linked-list

所以我有一个包含两个元素的链表,一个读入的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 

3 个答案:

答案 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