我一直在研究一個函數searchn()
,它需要鏈接列表list
和字符串lname
。通過C中的鏈接列表進行搜索
它編譯得非常好,但當我嘗試運行該函數時,出現了段錯誤(核心轉儲)。我跑過Valgrind,它告訴我我錯誤地使用了strcpy
和strcmp
。我的player
結構也包含在內供參考。任何人都可以看到我在做什麼錯了嗎?對不起,我不是最擅長編碼的人。
任何幫助將是偉大的。謝謝。
struct player {
char* fname;
char* lname;
char pos;
int val;
int rank;
struct player* next;
};
void searchn(struct player* list, char* lname){
while (list!=NULL && strcmp(list->lname, lname) != 0){
list = list->next;
}
if (list != NULL && strcmp(list->lname, lname)==0) {
printf("%s found! \n", lname);
printf("%s \n", list->lname);
printf("%s \n", list->fname);
printf("%c \n", list->pos);
printf("%d \n", list->val);
printf("\n");
}
}
以下是如何填充鏈表的方法。
void addp (struct player* newnode, struct player* list){
struct player* templist1;
// if the list is non empty.
if (list !=NULL){
if(newnode->pos == GOALKEEPER){ //insert if G.
while (list->next != NULL && (list->next)->rank < 1){
list = list->next;
}
templist1 = list->next;
list->next = newnode;
newnode->next = templist1;
}
if(newnode->pos == DEFENDER){// after G bef M.
// iterate through templist.
while (list->next != NULL && (list->next)->rank < 2) { // go to end of G.
// when the list isn't empty next node rank is less than one, keep going
list = list -> next;
}
// when finally rank == or > 1, then add newnode.
templist1 = list->next;
list->next = newnode;
newnode->next = templist1;
}
if(newnode->pos == MIDFIELDER){ //after G and M but before S
while (list->next != NULL && (list->next)->rank < 3) {
list = list -> next;
}
// when stopped, then add newnode.
templist1 = list->next;
list->next = newnode;
newnode->next = templist1;
}
if(newnode->pos == STRIKER){ // at the end.
while (list->next != NULL && (list->next)->rank < 4){
list = list -> next;
}
templist1 = list->next;
list->next = newnode;
newnode->next = templist1;
}
printf("player added");
}
}
您將需要展示如何在鏈接列表元素中分配和分配值。這個邏輯有可能是你的分段錯誤。 – lurker
我想是的,但事情是,填充鏈表的方法到目前爲止工作得很好。我有另一種搜索方法,通過搜索每個節點的'int val',這恰好工作正常。 –
您仍然需要展示字符串和結構如何分配以瞭解發生了什麼。以及如何將字符串複製到結構中。其中任何一個都可能產生分段錯誤。 – lurker