【问题标题】:How to sort a linkedlist in C programming?如何在 C 编程中对链表进行排序?
【发布时间】:2016-10-06 01:47:10
【问题描述】:

所以我正在尝试根据名称从小到大对链表进行排序。它对它进行排序,但它以相反或错误的方式排序。

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

//declaring a struct
struct node {
    char *name;
    int num;
    struct node *next;  
};
struct node *list=NULL;

/*
 * insert()
 */

struct node *insert(char word2[], int val){
    struct node *tmp;

    tmp = malloc(sizeof(struct node));
    if(tmp ==NULL){
        fprintf(stderr, "out of memory\n");
        exit(1);
    }

    tmp->name = strdup(word2);
    tmp->num = val;
    tmp->next = list;
    list = tmp;

    return tmp;
}//read string

void print(){
    struct node *ptr;
    for(ptr= list; ptr!=NULL; ptr = ptr->next){
        printf(" %s/%d\n", ptr->name, ptr->num);
    }//for loop
}//print

void sort(){
    struct node *ptr1, *ptr2;
    char *tmp;

    for(ptr1 = list; ptr1!=NULL; ptr1 = ptr1->next){
        for(ptr2 = ptr1->next; ptr2!=NULL; ptr2 = ptr2->next){
            if(strcmp(ptr1->name, ptr2->name)>0){
                //ptr1->name is "greater than" ptr2->name - swap them
                tmp = ptr1->name;
                ptr1->name = ptr2->name;
                ptr1->name = tmp;
            }
        }
    }
}//sort

int main (){
    char buff[81];
    int status=0;
    int len;
    char word1[20];
    char word2[20];
    int val;
    //      char word3[20];

    while(fgets(buff, 81, stdin)>0){
        len = strlen(buff);

        if(buff[len-1]!='\n'){
            fprintf(stderr,"Error: string line length was too long\n");
            exit(1);
        }

        sscanf(buff, "%s %s %d", word1, word2, &val);

        if(strcmp(word1, "insert")==0){
            insert(word2, val);
            sort();
        }else if(strcmp(word1, "print")==0){
            print();
        }else{

        }

    }//while loop

    return status;
}

这是我运行时输入的样子。

"insert a 1"
"insert b 2"
"insert c 3"
"print"

输出

c/3
b/2
a/1

如果尝试更改我的排序方法条件,但它一直以错误的方式排序。我似乎找不到错误。任何帮助将不胜感激。但是我的输出应该是这样的

期望的输出

a/1
b/2
c/3

【问题讨论】:

  • 您是否使用调试器单步执行您的程序?
  • 你是怎么做到的?
  • google gdb 将是一个开始
  • 这就像木匠问如何使用锤子 :-) 请随时询问 Google。您只是想了解使用调试器的第 X 百万人,但我相信您会有所收获。
  • 您的交换代码最后一行有错字。是仅在 StackOverflow 上还是在实际代码中?

标签: c sorting linked-list


【解决方案1】:

如果您在每个插入之后进行排序,则不需要完整的冒泡排序,只需一轮。

void sort()
{
  struct node *ptr1 = list;
  char *tmpname;
  int tmpnum;

  while (ptr1->next != NULL) { 
    if (strcmp(ptr1->name, ptr1->next->name) > 0) {
      // swap content in this case, not the nodes
      tmpname = ptr1->name;
      tmpnum = ptr1->num;

      ptr1->name = ptr1->next->name;
      ptr1->num = ptr1->next->num;

      ptr1->next->name = tmpname;
      ptr1->next->num = tmpnum;

    }
    ptr1 = ptr1->next;
  }
}

【讨论】:

    猜你喜欢
    • 2011-01-02
    • 2012-08-02
    • 2012-10-07
    • 2010-12-09
    • 1970-01-01
    • 2021-07-30
    • 2015-05-03
    • 2011-11-02
    • 2012-03-07
    相关资源
    最近更新 更多