Программа с int работает, а с char не работает - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Переменная типа int
#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;
}
Переменная типа char
#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;
}
С char программа работает, но выводит несколько раз последнюю введенную строку, а должна выводить разные строки, которые были введены.

Решение задачи: «Программа с 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;
}

Объяснение кода листинга программы

  1. В данном коде используется язык программирования C.
  2. Задача программы - работа со связанным списком (linked list) и добавление элементов в конец списка.
  3. В начале кода определены типы данных для списка и его элементов:
    • node_t - структура, представляющая узел списка. Содержит указатель на информацию в узле и указатель на следующий узел.
    • string_list_t - структура, представляющая список. Содержит указатель на начало списка, указатель на конец списка и размер списка.
  4. Затем определены функции для работы со списком:
    • string_duplicate - функция для создания копии строки в динамической области памяти.
    • string_list_init - функция для инициализации списка.
    • string_list_push_back - функция для добавления элемента в конец списка.
    • string_list_free - функция для освобождения памяти, занимаемой списком.
  5. В функции main создается экземпляр списка и инициализируется.
  6. Затем в список добавляются три элемента: 1, 2 и 3.
  7. После этого элементы списка выводятся на экран с помощью цикла.
  8. В конце программы список освобождается от памяти.
  9. Программа завершается без ошибок (возвращает 0).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5
Похожие ответы