Вывести на экран веденные списки - C (СИ)
Формулировка задачи:
Пытаюсь вывести на экран веденные списки, но ничего не печатается.
int main()
{
SLIST *lst1; // адрес начала списка
SLIST *lst2;
lst1 = (SLIST*)malloc(sizeof(slist));
lst2 = (SLIST*)malloc(sizeof(slist));
init_slist(lst1);
init_slist(lst2);
int N,N2;
printf("\nINPUT SIZE OF THE SPISOK: ");
scanf("%d",&N); // ввод размера списка
PNODE nd; // указатель на последний элемент
printf("\nINPUT DATE:");
do{ // цикл формирования списка
nd=(PNODE)malloc(sizeof(node));
nd=prepand(lst1,nd);
if(nd==NULL) // выход из цикла
break;
N--; // счетчик введенных элементов
} while(N > 0); // пока необходимо вводить элементы
printf("\n\n\nOur SPISOK:");
print_to_slist(lst1); // вывод на печать сформированного списка
fflush(stdin);
//free(nd);
PNODE nd1;
printf("\nINPUT SIZE OF THE SPISOK: ");
scanf("%d",&N2); // ввод размера списка
//PNODE first2=NULL; // указатель на последний элемент
printf("\nINPUT DATE:");
do{ // цикл формирования списка
nd1=(PNODE)malloc(sizeof(node));
nd1=prepand(lst2,nd1);
if(nd1==NULL) // выход из цикла
break;
N2--; // счетчик введенных элементов
} while(N2 > 0); // пока необходимо вводить элементы
printf("\n\n\nOur SPISOK:");
print_to_slist(lst2);
return 0;
} PNODE prepand(SLIST *l,PNODE nd)
{
//PNODE nd; // указатель на новый элемент
static int num=1; // номер вводимого элемента
//nd=(PNODE)malloc(sizeof(node)); // выделение памяти для элемента
printf("\n\t%d element: ",num);
scanf("%d",&nd->info); // ввод данных
if(nd->info==0) // окончание ввода данных
{
free(nd);
return NULL;
}
fflush(stdin); // очищение буфера ввода
nd->next=NULL;
if(is_slist_empty(l))
{
l->head = l->tail =nd;
nd->next = NULL;
l->count = 1;
}
else{
nd->next = l->head;
l->head = nd;
num++;
} // счетчик элементов
return nd;
}Решение задачи: «Вывести на экран веденные списки»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
typedef struct Node_t {
int info;
struct Node_t* next;
} Node;
typedef struct List_t {
Node* head;
Node* tail;
} List;
//-----------------------------------------------------------------------------
List* push(List* list, int info) {
Node* node = malloc(sizeof(Node));
node->info = info;
node->next = NULL;
if (list->head == NULL) {
list->head = list->tail = node;
}
else {
list->tail->next = node;
list->tail = node;
}
return list;
}
//-----------------------------------------------------------------------------
void write(const List* list) {
const Node* node = list->head;
for (; node; node = node->next) {
printf("%d ", node->info);
}
printf("\n");
}
//-----------------------------------------------------------------------------
List* read(List* list, int cnt) {
int info;
while ((cnt--) && (scanf("%d", &info) == 1)) {
push(list, info);
}
return list;
}
//-----------------------------------------------------------------------------
int main() {
List list1 = {NULL, NULL};
List list2 = {NULL, NULL};
int n1, n2;
printf("input size list: ");
scanf("%d", &n1);
read(&list1, n1);
write(&list1);
printf("input size list: ");
scanf("%d", &n2);
read(&list2, n2);
write(&list2);
return 0;
}
Объяснение кода листинга программы
В данном коде реализована работа с двумя связанными списками. Они состоят из узлов, каждый из которых содержит целочисленную информацию и ссылку на следующий узел.
- Создаются структуры
NodeиList. В структуреNodeсодержится информация о узле, а именно целочисленное значение и указатель на следующий узел. В структуреListсодержатся указатели на голову и хвост списка. - Функция
pushдобавляет новый узел в начало списка. Если список пуст, то новый узел становится и головой, и хвостом. В противном случае новый узел добавляется в начало списка, а указатель на хвост обновляется. - Функция
writeвыводит на экран все узлы списка, последовательно перебирая их. - Функция
readсчитывает из консоли список целочисленных значений и добавляет их в список с помощью функцииpush. Количество считываемых значений ограничено указанным параметром. - В функции
mainсоздаются два пустых списка. Затем пользователь вводит количество элементов для каждого списка, после чего список заполняется с помощью функцииread. Наконец, списки выводятся на экран с помощью функцииwrite.