Программа с int работает, а с char не работает - C (СИ)
Формулировка задачи:
Переменная типа int
Переменная типа char
С char программа работает, но выводит несколько раз последнюю введенную строку, а должна выводить разные строки, которые были введены.
#include<stdio.h> #include<malloc.h> #include<string.h> typedef struct sp { int info; struct sp *next; }sp; int main(){ int k,i,a; sp *head,*buf,*prev; head=NULL; printf("Vvedite kolichestvo strok:\n"); scanf("%d",&k); printf("Vvedite stroki:\n"); for(i=0;i<k;i++){ scanf("%d",&a); if(head==NULL){ head=(sp*)malloc(sizeof(sp)); head->info=a; head->next=NULL; prev=head; } else{ buf=(sp*)malloc(sizeof(sp)); buf->info=a; buf->next=NULL; prev->next=buf; prev=buf; } } printf("Otvet\n"); while(head) { printf("%d\n", head->info); head=head->next; } return 0; }
#include<stdio.h> #include<malloc.h> #include<string.h> typedef struct sp { char *info; struct sp *next; }sp; int main(){ int k,i; char a[100]; sp *head,*buf,*prev; head=NULL; printf("Vvedite kolichestvo strok:\n"); scanf("%d",&k); printf("Vvedite stroki:\n"); for(i=0;i<k;i++){ scanf("%s",a); if(head==NULL){ head=(sp*)malloc(sizeof(sp)); head->info=a; head->next=NULL; prev=head; } else{ buf=(sp*)malloc(sizeof(sp)); buf->info=a; buf->next=NULL; prev->next=buf; prev=buf; } } printf("Otvet\n"); while(head) { printf("%s\n", head->info); head=head->next; } return 0; }
Решение задачи: «Программа с int работает, а с char не работает»
textual
Листинг программы
#include <stddef.h> #include <string.h> #include <stdlib.h> #include <stdio.h> /********************************************* * ветвь списка *********************************************/ typedef struct Node { char* info; struct Node* next; } node_t; /********************************************* * список *********************************************/ typedef struct StringList { node_t* head; /* указатель на начало списка */ node_t* tail; /* указатель на конец списка */ size_t size; /* количество элементов в списке */ } string_list_t; /********************************************* * создание копии строки в динамической области *********************************************/ char* string_duplicate(const char* src) { char* dest = (char*) malloc(strlen(src) + 1); return dest == NULL ? NULL : strcpy(dest, src); } /********************************************* * начальная инициализация списка *********************************************/ void string_list_init(string_list_t* lst) { lst->head = lst->tail = NULL; lst->size = 0; } /********************************************* * добавление элемента в конец списка *********************************************/ int string_list_push_back(string_list_t* lst, const char* info) { if(lst->head == NULL) { lst->head = (node_t*) malloc(sizeof(node_t)); if(lst->head == NULL) return -1; lst->head->info = string_duplicate(info); if(lst->head->info == NULL) { free(lst->head); return -1; } lst->head->next = NULL; lst->tail = lst->head; } else { lst->tail->next = (node_t*) malloc(sizeof(node_t)); if(lst->tail->next == NULL) return -1; lst->tail->next->info = string_duplicate(info); if(lst->tail->next->info == NULL) { free(lst->tail->next); return -1; } lst->tail = lst->tail->next; lst->tail->next = NULL; } ++lst->size; return 0; } /********************************************* * удаление памяти занимаемой списком *********************************************/ void string_list_free(string_list_t* lst) { node_t* curr = lst->head; while(curr != NULL) { node_t* next = curr->next; free(curr->info); free(curr); curr = next; } } int main(void) { node_t* node; string_list_t lst; string_list_init(&lst); string_list_push_back(&lst, "1"); string_list_push_back(&lst, "2"); string_list_push_back(&lst, "3"); for(node = lst.head; node != NULL; node = node->next) puts(node->info); string_list_free(&lst); return 0; }
Объяснение кода листинга программы
- В данном коде используется язык программирования C.
- Задача программы - работа со связанным списком (linked list) и добавление элементов в конец списка.
- В начале кода определены типы данных для списка и его элементов:
- node_t - структура, представляющая узел списка. Содержит указатель на информацию в узле и указатель на следующий узел.
- string_list_t - структура, представляющая список. Содержит указатель на начало списка, указатель на конец списка и размер списка.
- Затем определены функции для работы со списком:
- string_duplicate - функция для создания копии строки в динамической области памяти.
- string_list_init - функция для инициализации списка.
- string_list_push_back - функция для добавления элемента в конец списка.
- string_list_free - функция для освобождения памяти, занимаемой списком.
- В функции main создается экземпляр списка и инициализируется.
- Затем в список добавляются три элемента:
1
,2
и3
. - После этого элементы списка выводятся на экран с помощью цикла.
- В конце программы список освобождается от памяти.
- Программа завершается без ошибок (возвращает 0).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д