Не получается распечатать весь стек - C (СИ)
Формулировка задачи:
помогите найти ошибку в коде программы:
не получается распечатать стек. вобщем печатает только последний введенный элемент.
допустим я ввёл данные 2-х человек, а распечатывает только данные последнего введенного человека!
#include<stdio.h>
#include<stdlib.h>
struct el_st
{char familia[15],
gorod[20],
ulica[20],
imya[15],
pol[10],
nacionalnost[20],
dom_adres[81],
nom_tel[20],
data_rozhd[20];
int nom_dom,
nom_kvart,
rost,
ves,
dom_adr;
long index;
struct el_st *sled;
};
void vvod(struct el_st *us);
main()
{struct el_st *i;
struct el_st *us;
int k;
i=NULL;
us=malloc(sizeof(struct el_st));
clrscr();
printf("baza dannih chelovek.\n");
if(us!=NULL)
do
{vvod(us);
printf("hotite vvesti dannie drugogo cheloveka? (1-da, 2-net) ");
scanf("%d",&k);
}
while(k!=2);
printf("\n Baza dannih:");
for(i=us;i!=NULL;i=i->sled)
{printf("\nFamiliya:%s\nImya:%s\nPol:%s\nNocional'nost':%s\n",us->familia,
i->imya,i->pol,i->nacionalnost);
printf("Rost:%d\nves:%d\ndomashniy adres:index %ld g.%s ul.%s,%d kv.%d",
i->rost,i->ves,i->index,i->gorod,i->ulica,i->nom_dom,i->nom_kvart);
printf("\nData rozhdeniya:%s\nNomer telefona:%s\n",i->data_rozhd,i->nom_tel);
}
getch();
}
void vvod(struct el_st *us)
{printf(" Familiya:");
scanf("%s",us->familia);
printf(" Imya:");
scanf("%s",us->imya);
printf(" Pol:");
scanf("%s",us->pol);
printf(" Nacional'nost':");
scanf("%s",us->nacionalnost);
printf(" rost:");
scanf("%d",&us->rost);
printf(" ves:");
scanf("%d",&us->ves);
printf(" data rozhdeniya:");
scanf("%s",&us->data_rozhd);
printf(" nomer telefona:");
scanf("%s",&us->nom_tel);
printf(" index:");
scanf("%ld",&us->index);
printf(" gorod:");
scanf("%s",&us->gorod);
printf(" ulica:");
scanf("%s",&us->ulica);
printf(" nomer doma:");
scanf("%d",&us->nom_dom);
printf(" nomer rvartiri:");
scanf("%d",&us->nom_kvart);
}Решение задачи: «Не получается распечатать весь стек»
textual
Листинг программы
#include<stdio.h>
#include<stdlib.h>
#include <conio.h>
using namespace std;
struct el_st
{char familia[15],
gorod[20],
ulica[20],
imya[15],
pol[10],
nacionalnost[20],
dom_adres[81],
nom_tel[20],
data_rozhd[20];
int nom_dom,
nom_kvart,
rost,
ves,
dom_adr;
long index;
struct el_st *sled;
};
void vvod(struct el_st *us);
main()
{
el_st *us;
el_st *head=NULL;
el_st *tail=NULL;
int k;
printf("baza dannih chelovek.\n");
do
{
us=(el_st*)malloc(sizeof(el_st));//выделяем память
vvod(us);//вводим
if(head==NULL && tail==NULL)//если список пуст, то us - голова
head = us;
else//иначе назначаем ссылку последнему элементу
tail->sled = us;
tail=us;//перемещаем хвост
tail->sled = NULL;
printf("hotite vvesti dannie drugogo cheloveka? (1-da, 2-net) ");
scanf("%d",&k);
}while(k!=2);
printf("\n Baza dannih:");
for(us=head;us!=NULL;us=us->sled)
{
printf("\nFamiliya:%s\nImya:%s\nPol:%s\nNocional'nost':%s\n",us->familia,
us->imya,us->pol,us->nacionalnost);
printf("Rost:%d\nves:%d\ndomashniy adres:index %ld g.%s ul.%s,%d kv.%d",
us->rost,us->ves,us->index,us->gorod,us->ulica,us->nom_dom,us->nom_kvart);
printf("\nData rozhdeniya:%s\nNomer telefona:%s\n",us->data_rozhd,us->nom_tel);
}
getch();
}
void vvod(struct el_st *us)
{printf(" Familiya:");
scanf("%s",us->familia);
printf(" Imya:");
scanf("%s",us->imya);
printf(" Pol:");
scanf("%s",us->pol);
printf(" Nacional'nost':");
scanf("%s",us->nacionalnost);
printf(" rost:");
scanf("%d",&us->rost);
printf(" ves:");
scanf("%d",&us->ves);
printf(" data rozhdeniya:");
scanf("%s",&us->data_rozhd);
printf(" nomer telefona:");
scanf("%s",&us->nom_tel);
printf(" index:");
scanf("%ld",&us->index);
printf(" gorod:");
scanf("%s",&us->gorod);
printf(" ulica:");
scanf("%s",&us->ulica);
printf(" nomer doma:");
scanf("%d",&us->nom_dom);
printf(" nomer rvartiri:");
scanf("%d",&us->nom_kvart);
}
Объяснение кода листинга программы
- В программе определен структурный тип данных
el_st, который содержит информацию о человеке, включая поля: familia, gorod, ulica, imya, pol, nacionalnost, dom_adres, nom_tel, data_rozhd, nom_dom, nom_kvart, rost, ves, dom_adr, index. - В функции main() создается пустой список (в виде указателей на элементы структуры el_st), и затем в цикле do-while добавляются новые элементы, пока пользователь не введет цифру 2.
- Для каждого элемента списка в цикле for выводятся значения всех его полей.
- Функция vvod() используется для ввода данных о новом элементе списка. Она последовательно запрашивает и сохраняет значения всех полей структуры el_st в соответствующем элементе списка.