Программа с 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).