我试图按字母顺序对列表进行排序,但我遇到了一些问题。我有以下内容:
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);
}
答案 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));