Ошибка при добавлении записи по возрастанию в двусвязный список - 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);
}