Как мне сделать два узла дважды связанными? после некоторой отладки я обнаружил, что в Create(…) -> в else что-то не так с (*H) — >>next=…;

#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. Наконец: программа не завершается, но попадает в цикл, если вы закрываете входной поток.