Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 按字母顺序对链表排序_C_Arrays_List_Sorting_Dynamic - Fatal编程技术网

C 按字母顺序对链表排序

C 按字母顺序对链表排序,c,arrays,list,sorting,dynamic,C,Arrays,List,Sorting,Dynamic,我正试着按字母顺序排列我的名单,但我有一些问题。我有以下资料: struct listNodeData { int value; char *position; char *lastName; struct listNodeData * next; }; typedef struct listNodeData listNodeData; voi

我正试着按字母顺序排列我的名单,但我有一些问题。我有以下资料:

    struct listNodeData
        {
            int value;
            char *position;
            char *lastName;
            struct listNodeData * next;
        };
        typedef struct listNodeData listNodeData;

void sortList(listNodeData *List)
{
    int swapped;
    listNodeData *ptr1;
    listNodeData *lptr = NULL;

    do
    {
        swapped = 0;
        ptr1 = List->next;

        while (ptr1->next != lptr)
        {
            if (strcmp(ptr1->lastName,ptr1->next->lastName) > 0)
            {
                swap(ptr1,ptr1->next);
                swapped = 1;
            }
            ptr1 = ptr1->next;
        }
        lptr = ptr1;
    }
    while (swapped);

}

void swap (listNodeData *a,listNodeData *b)
{

    char *lastName = malloc(sizeof(char) * 20);
    strcpy(lastName,a->lastName);
    strcpy(a->lastName,b->lastName);
    strcpy(b->lastName,lastName);

}
我正在尝试按姓氏对链接列表进行排序。现在,我只是尝试交换节点的姓氏,然后再考虑将值和位置与姓氏一起交换。当我编译我的程序时,当我运行它时,它工作,我得到总线错误10

我不太清楚我为什么会出总线错误。我看过了,可能和我的strcmp有关?我不知道为什么,因为我在初始化节点时malloced lastName,并在swap函数中mallocing

链表有一个伪标题节点,所以我有
ptr1=List->next
而不是
ptr1=List

listNodeData *initNode(int number,char *lastName,char *position)
{
    listNodeData *newNode;
    newNode = malloc(sizeof(listNodeData));
    newNode->position = malloc(sizeof(char) * 20);
    newNode->position = position;
    newNode->lastName = malloc(sizeof(char) * 20);
    newNode->lastName = lastName;
    newNode->value = value;
    newNode->next = NULL;
    return (newNode);
}

在初始化代码中

newNode->lastName = malloc(sizeof(char) * 20);
newNode->lastName = lastName;
这不会使用您malloc'ed的缓冲区。相反,它会将指向缓冲区的指针替换为给定给函数的
lastName
。使用strcpy将lastname移动到缓冲区中:

strcpy(newNode->lastName, lastName);
注意:类似地,
position
属性也存在相同的问题,因此这两个属性都需要执行

需要注意的其他一些问题:

  • 不要忘记在交换结束时
    释放(lastName)
    ,以免在交换中产生内存泄漏

    • 交换函数中没有为字符串分配空间

      试试这个:

      char*  lastName = (char*) malloc(20*sizeof(char));
      

      你是如何初始化链表中使用的数据的?我现在就编辑这篇文章只是旁注:你不需要line
      typedef struct listNodeData listNodeData,您已经在另一个侧注上方将type
      listNodeData
      定义为
      struct
      。很难找到一种对指针集合进行排序的效率较低的方法。想想为了完成排序,必须遍历整个列表多少次。每次交换单个节点时,
      swapped=1qsort
      作为替代方法。完全忘记了这一点!我会试试看now@FreeStyle4-因为lastName只有20个字符,所以可以使用_alloca()或alloca()在堆栈外进行分配(名称取决于编译器),在这种情况下不需要free()。由于程序不是递归或可重入的,您可以将lastName声明为静态(作为静态数组)。不要强制转换
      malloc
      的返回。这是完全不必要的,可以隐藏错误。请参阅:以获取详细解释
      char*lastname=malloc(20*sizeof*lastname)是所有需要的。