Ошибка при добавлении записи по возрастанию в двусвязный список - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Задание следующее: Добавлять новые записи в двусвязный список так, чтобы список был упорядочен по возрасту. Ниже приведен код. Код работает некорректно, вот начало:
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
struct spis
 {char name [15];
 int god;
  struct spis *v1;
  struct spis *v2;
 };
 
 void sort (struct spis *);
 struct spis * head, * tail;
 main()
 {
  sort (head); 
  free (head); 
 }
 
void  sort (struct spis *p)
{
  char key;
  struct spis *ps;
  ps=NULL;
  do
    {
     ps=(struct spis *) malloc(sizeof(struct spis)); 
     printf("\n Фамилия: ");
     gets (ps->name);
     printf("\n Год рождения: ");
     scanf ("%d",&ps->god);
     fflush(stdin);
 
     if (p==NULL)
      {
    ps->v2=p;
    ps->v1=NULL;
    p->v2=ps;
    head=ps;
    tail=ps;
       }
а отсюда код не работает, просто вылетает в конец кода на печать на экране, ничего не анализируя, и не опускаясь по всем если:
else if (p->god<=ps->god)
       p=p->v2;
      else if (p==head)
          {
        ps->v1=NULL;
        ps->v2=p;
        p->v1=ps;
        head=ps;
          }
          else if(p==tail)
           {
            ps->v1=tail;
            ps->v2=NULL;
            p->v2=ps;
            tail=ps;
           }
          else
           {
            ps->v1=p->v1;
            ps->v2=p;
            p->v1=ps;
           }
    printf("\n Продолжить ввод? <Esc> \n");
   }
   while (getch()!=27);
   getch();
 
     }
Помогите, пожалуйста, найти ошибки.

Решение задачи: «Ошибка при добавлении записи по возрастанию в двусвязный список»

textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
struct spis
 {char name [15];
 int god;
  struct spis *v1;//предыдущий
  struct spis *v2;//последующий
 };
 void create (void);
 void scan (struct spis *); 
 void sort (struct spis *);
 struct spis * head, * tail; 
 main()
 {
  char k;
  while(1)
  {
    clrscr ();
   puts ("1 - создать");
   puts ("2 - просмотр");
  puts ("4 - добавлять записи в порядке возрастания");
   puts ("0 - выход");
   k = getch ();
   switch (k)
   {
    case '1':create (); break;
    case '2':scan (head); break;
    case '4': sort (head); break;
    case '0': {free (head); return 0;}
    default: puts ("*Ошибка");
   }
  }
 }
 void create (void)
 {
  char key;
  struct spis *p, *pred;
  pred=NULL;
  do
    {
     p=(struct spis *) malloc(sizeof(struct spis));
     printf("\n Фамилия: ");
     gets (p->name);
     printf("\n год рождения: ");
     scanf ("%d",&p->god);
     fflush(stdin);
     p->v1=pred;
     if (pred!=NULL)
       pred->v2=p;  
     else   
       head=p; 
     pred=p;
     printf("\n закончить ввод? <Esc> \n");
    }
  while (getch()!=27);
  tail=p;
  tail->v2=NULL;
 }
void scan (struct spis *p)
{int i=0;
 clrscr();
 printf ("\n N     фамилия");
 printf ("\n год рождения");
 if (p==head)
  {
   while (p!=NULL)
    {i++;
     printf ("\n %d",i);
     printf(" %15s %4d", p->name, p->god);
     p=p->v2;
    }
   }
  else
   if (p==tail)
     while (p!=NULL)
       {
    i++;
    printf ("\n %d",i);
    printf("\n %15s  %4d", p->name, p->god);
    p=p->v1;
       }
   else
    printf("\n ЌҐўҐа*л© *¤аҐб ");
 getch();
}
 void  sort (struct spis *p)
{
  char key;
  struct spis *ps;
  ps=NULL;
  do
    {
     ps=(struct spis *) malloc(sizeof(struct spis)); 
     printf("”*¬Ё«Ёп: ");
     gets (ps->name);
     printf("ѓ®¤ ஦¤Ґ*Ёп: ");
     scanf ("%d",&ps->god);
     fflush(stdin);
 
     if (p==NULL)
      {
    ps->v2=p;
    ps->v1=NULL;
    p->v2=ps;
    head=ps;
    tail=ps;
       }
     else if (p->god<=ps->god)
       p=p->v2;
      else if (p==head)
          {
        ps->v1=NULL;
        ps->v2=p;
        p->v1=ps;
        head=ps;
          }
          else if(p==tail)
           {
            ps->v1=tail;
            ps->v2=NULL;
            p->v2=ps;
            tail=ps;
           }
          else
           {
            ps->v1=p->v1;
            ps->v2=p;
            p->v1=ps;
           }
    printf("\n закончить ввод? <Esc> \n");
   }
   while (getch()!=27);
   getch();
   scan(head);
  }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы