Ошибка при добавлении записи по возрастанию в двусвязный список - 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); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д