#c #linked-list #doubly-linked-list
Вопрос:
У меня есть школьный проект, в котором я должен создать такое меню для обработки двойного связанного списка с содержимым с плавающей точкой,но у меня большие проблемы с его двойной связью, и после некоторой отладки похоже,что это все (*H)-gt;следующая…ошибка (кроме моей), когда я получаю новый код, я указываю его «следующая» часть на адрес главы, а «предыдущая» часть главы указывает на адрес нового кода, а затем делает адрес главы адресом new_node, таким образом, глава, фактически становится главой.
#include lt;stdio.hgt; #include lt;stdlib.hgt; struct node { char data; struct node *next; struct node *prev; }; void Create(struct node **H,char val) { struct node *new_node; new_node=malloc(1*sizeof(struct node)); new_node-gt;data=val; if(new_node==NULL){ printf("RIP"); return; }else{ new_node-gt;next=*H; new_node-gt;prev=NULL; (*H)-gt;prev=new_node; } } void Delete(struct node **H){ if(*H!=NULL){ struct node *temp = H; temp-gt;next=NULL; printf("Deleting last element with value: %cn",(*H)-gt;data); *H=(*H)-gt;next; free(temp); }else{ printf("Empty list.n"); } } void DisplayF(struct node *H){ int i = 0; if(H==NULL){printf("Empty listn");return;}; while(H!=NULL){ i ; printf("Element #%d: %cn",i, H-gt;data); H=H-gt;next; } return; } void DisplayB(struct node *H){ int i = 0; if(H==NULL){printf("Empty listn");return;}; while(H!=NULL){ i ; printf("Element #%d: %cn",i, H-gt;data); H=H-gt;prev; } return; } void Search(struct node *H,char val){ int i = 0; while(H!=NULL){ i ; if(H-gt;data==val){ printf("Character '%c' was found in element %dn",H-gt;data,i); return; } H=H-gt;next; } printf("The value you are looking for does not exist.n"); } int main(){ struct node *head=NULL; int inp; char d; do{ printf("1.Createn2.Deleten3.Displayn4.Searchn0.Exitn"); scanf("%d",amp;inp); switch (inp){ case 1: printf("Enter the new node's character value: "); scanf(" %c",amp;d); Create(amp;head,d); break; case 2: Delete(amp;head); break; case 3: DisplayF(head); break; case 4: DisplayB(head); case 5: printf("What character do you want to search for? "); scanf(" %c",amp;d); Search(head,d); break; case 0: exit(0); default: printf("Enter a valid option from the menu below:n"); break; } }while(inp!=0); return 0; }
Комментарии:
1. Это
Create
выглядит неправильно.new_node-gt;next=*H;
поставит new_node перед старым заголовком. НоH
это не изменилось. Глава должна быть обновлена следующим образом :*H = new_node
. Возможно, есть и другие проблемы, но я не смотрел дальше этого. И вы на самом деле не описали конкретную проблему, кроме «что-то не так». Пожалуйста, укажите точные данные, ожидаемый результат и фактический результат.2. В дополнение к этому: на первой итерации,
*H
естьNULL
. Тем не менее, вы пытаетесь получить доступ к участнику:(*H)-gt;prev
. Вам нужно проверить, если*H
это неNULL
так, и только затем установить егоprev
член.3. И в-третьих:
struct node *temp = H;
должно бытьstruct node *temp = *H;
.4. Наконец: программа не завершается, но попадает в цикл, если вы закрываете входной поток.