使用数组指针对结构进行排序不起作用
Sorting a struct with array pointer is not working
我正在创建两个结构:Deck 和 Card。我想使用 qsort 对甲板上的卡片进行排序,但这不起作用。当我 运行 发生异常:分段错误。
按照我的代码:
typedef struct Card {
int value;
}Card;
typedef struct Deck{
Card *c[100];
int top;
}Deck;
Card * newCard(int value) {
Card * aux = (Card *)malloc(sizeof(Card));
aux->value = value;
return aux;
}
Deck * newDeck() {
Deck * deck = (Deck *)malloc(sizeof(Deck));
deck->top = 0;
return deck;
}
void addCard(Deck *b, Card *c) {
b->top++;
b->c[b->top] = c;
}
int compare(const void *x, const void *y) {
Card * xa = *(Card **) x;
Card * ya = *(Card **) y;
if(xa->value == ya->value)
return 0;
if(xa->value > ya->value)
return 1;
return -1;
}
void sort(Deck *b) {
qsort(b->c, b->top, sizeof(struct Card*), compare);
}
int main() {
Deck * b = newDeck();
addCard(b,newCard(11));
addCard(b,newCard(12));
addCard(b,newCard(11));
addCard(b,newCard(1));
addCard(b,newCard(1));
sort(b);
return 0;
}
有人可以帮助我吗?我只想对甲板上的卡片进行排序,但逻辑有问题。可能类似于指针(malloc 或 calloc?)。
嗯....你的代码看起来像 "fill in the blanks",因为你没有发布完整的代码,你发布的代码是正确的。因此,我以有效的方式完成了您的代码:
#include <stdio.h>
#include <stdlib.h>
// Your code
typedef struct Card {
int value;
}Card;
typedef struct Deck{
Card *c[100];
int top;
}Deck;
int compare(const void *x, const void *y) {
Card* xa = *(Card **) x;
Card* ya = *(Card **) y;
if(xa->value == ya->value)
return 0;
if(xa->value > ya->value)
return 1;
return -1;
}
void sort(Deck *b) {
qsort(b->c, b->top, sizeof(struct Card*), compare);
}
// My main
int main() {
Deck d;
d.c[0] = calloc(1, sizeof(Card));
d.c[0]->value = 5;
d.c[1] = calloc(1, sizeof(Card));
d.c[1]->value = 1;
d.c[2] = calloc(1, sizeof(Card));
d.c[2]->value = 3;
d.top = 3;
sort(&d);
printf("%d %d %d", d.c[0]->value, d.c[1]->value, d.c[2]->value);
return 0;
}
我对你的分段错误的猜测是你正在访问 Card
没有分配它。
更新:
您的 addCard()
不正确。这是正确的:
void addCard(Deck *b, Card *c) {
b->c[b->top] = c;
b->top++;
}
当您添加卡片时,您的 top
点将放置您需要添加卡片的位置。所以你需要在添加后增加它。请记住,您也需要为其添加检查以防止溢出 Deck->c
.
我正在创建两个结构:Deck 和 Card。我想使用 qsort 对甲板上的卡片进行排序,但这不起作用。当我 运行 发生异常:分段错误。 按照我的代码:
typedef struct Card {
int value;
}Card;
typedef struct Deck{
Card *c[100];
int top;
}Deck;
Card * newCard(int value) {
Card * aux = (Card *)malloc(sizeof(Card));
aux->value = value;
return aux;
}
Deck * newDeck() {
Deck * deck = (Deck *)malloc(sizeof(Deck));
deck->top = 0;
return deck;
}
void addCard(Deck *b, Card *c) {
b->top++;
b->c[b->top] = c;
}
int compare(const void *x, const void *y) {
Card * xa = *(Card **) x;
Card * ya = *(Card **) y;
if(xa->value == ya->value)
return 0;
if(xa->value > ya->value)
return 1;
return -1;
}
void sort(Deck *b) {
qsort(b->c, b->top, sizeof(struct Card*), compare);
}
int main() {
Deck * b = newDeck();
addCard(b,newCard(11));
addCard(b,newCard(12));
addCard(b,newCard(11));
addCard(b,newCard(1));
addCard(b,newCard(1));
sort(b);
return 0;
}
有人可以帮助我吗?我只想对甲板上的卡片进行排序,但逻辑有问题。可能类似于指针(malloc 或 calloc?)。
嗯....你的代码看起来像 "fill in the blanks",因为你没有发布完整的代码,你发布的代码是正确的。因此,我以有效的方式完成了您的代码:
#include <stdio.h>
#include <stdlib.h>
// Your code
typedef struct Card {
int value;
}Card;
typedef struct Deck{
Card *c[100];
int top;
}Deck;
int compare(const void *x, const void *y) {
Card* xa = *(Card **) x;
Card* ya = *(Card **) y;
if(xa->value == ya->value)
return 0;
if(xa->value > ya->value)
return 1;
return -1;
}
void sort(Deck *b) {
qsort(b->c, b->top, sizeof(struct Card*), compare);
}
// My main
int main() {
Deck d;
d.c[0] = calloc(1, sizeof(Card));
d.c[0]->value = 5;
d.c[1] = calloc(1, sizeof(Card));
d.c[1]->value = 1;
d.c[2] = calloc(1, sizeof(Card));
d.c[2]->value = 3;
d.top = 3;
sort(&d);
printf("%d %d %d", d.c[0]->value, d.c[1]->value, d.c[2]->value);
return 0;
}
我对你的分段错误的猜测是你正在访问 Card
没有分配它。
更新:
您的 addCard()
不正确。这是正确的:
void addCard(Deck *b, Card *c) {
b->c[b->top] = c;
b->top++;
}
当您添加卡片时,您的 top
点将放置您需要添加卡片的位置。所以你需要在添加后增加它。请记住,您也需要为其添加检查以防止溢出 Deck->c
.