Intereting Posts

Сохранение отдельных слов в связанном списке

В основном у меня есть 2 связанный список: список и отдельный. Существует несколько наборов слов, которые ранее были сохранены в структуре «list». Собирался написать программу, которая найдет слова, которые являются отдельными / уникальными, и сохранит их в «отдельной» структуре. Вот что я получил до сих пор на основе моей концепции указателей. Однако, когда я пытаюсь напечатать «отличный», программа вылетает 🙁 пожалуйста, поправьте меня, если я ошибаюсь.

struct list { char string[50]; struct list *next; }; struct distinct { char string[50]; struct distinct *next; }; void checkdistinct() { list *ori = NULL; distinct *copy = NULL; distinct *check = NULL; if(ori == NULL && copy == NULL) { //first time. ori = ori->next; copy = copy->next; copy = (distinct*)malloc(sizeof(distinct)); strcpy(copy->string, ori->string); ori = ori->next; copy = copy->next; } else {} while(ori!=NULL) { check = check->next; while(check != NULL) { if(strcmp(ori->string, check->string)!=0) { check = check->next; } else { ori = ori->next; check = NULL; } } //only compare same casing words, for now. copy = (distinct*)malloc(sizeof(distinct)); strcpy(copy->string, ori->string); ori = ori->next; copy = copy->next; } } 

Когда я попытаюсь напечатать в главном, это сработает 🙁 ответьте, если вам нужны дополнительные комментарии для кодов. Спасибо!

Эти три линии – один из возможных виновников:

 if(ori == NULL && copy == NULL) { //first time. ori = ori->next; copy = copy->next; 

Здесь вы проверяете, являются ли ori и copy NULL , затем вы сразу же разыгрываете эти NULL указатели!

В вашем коде отличительным является не имя переменной, а структуры. Вы, кажется, неправильно поняли указатели, надеюсь, это поможет, хотя это напрямую не связано с вашим вопросом.

Я пропустил много ошибок, чтобы сделать код более простым.

 typedef struct listnode { char string[50]; struct listnode *next; } list_node; typedef struct listbase { list_node *head; int numberOfElements; } list; /* Add a new string at the start of the list */ void ListPrepend(list *myList, char *myString) { list_node *newNode = malloc(sizeof *newNode); /* create node to store string */ strcpy(newNode->string, myString); /* copy string into node */ newNode->next = myList->head; /* New node now followed by whole list */ myList->head = newNode; /* List now starts with new node */ myList->numberOfElements++; } /* Add a new string at the end of the list */ void ListAppend(list *myList, char *myString) { list_node *newNode = malloc(sizeof *newNode), /* create node to store string */ *currentNode = myList->head; /* pointer to node so we can find the end */ strcpy(newNode->string, myString); /* copy string into new node */ newNode->next = NULL; /* Nothing following this node */ if ( myList->head == NULL ) { myList->head = newNode; /* we didn't have a start node so assign it */ } else { /* if there is a next node, move to it */ while ( currentNode->next != NULL ) { currentNode = currentNode->next; } /* there is no next node so add new node on the end */ currentNode->next = newNode; } myList->numberOfElements++; } /* Show the list in order head to tail */ void ListDisplay(list *myList) { list_node *currentNode = myList->head; while ( currentNode != NULL ) { printf("%s\n", currentNode->string); currentNode = currentNode->next; } } int main() { list distinct = {0}; /* Now there is a variable called distinct */ char name[][20] = {"Lim Zheng Yue", "Monkey", "Dave"}; ListAppend(&distinct, name[0]); ListAppend(&distinct, name[1]); ListPrepend(&distinct, name[2]); ListDisplay(&distinct); }