按字母顺序排列链接列表

时间:2016-07-01 19:13:10

标签: c arrays list sorting dynamic

我试图按字母顺序对列表进行排序,但我遇到了一些问题。我有以下内容:

    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有关吗?我不确定为什么因为我在初始化节点时对mallName进行了malloc,并在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);
}

2 个答案:

答案 0 :(得分:1)

在初始化代码中,

newNode->lastName = malloc(sizeof(char) * 20);
newNode->lastName = lastName;

这不使用malloc'ed的缓冲区。相反,它将指向缓冲区的指针替换为函数的lastName。使用strcpy将姓氏移动到缓冲区中:

strcpy(newNode->lastName, lastName);

注意:同样地,position属性存在同样的问题,因此需要对两者进行此操作。

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

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

答案 1 :(得分:0)

交换功能中没有为字符串分配空间。

试试这个:

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