Объединение двух связных списков в один - C (СИ)

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

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

Прога должна считать данные, строки, из командной строки, так мы создадим связный список, а потом один из них присоединяем к другому. Я уверен, что косяки в в функции
void read(struct symbols *axe, char *data)    // функция должна заносить данные в связный список
А вот собственно и сама программа
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 50
 
struct symbols{
    char letter[N];
    struct symbols *nextPtr;
 
};
void read(struct symbols*,char *);
void concatenate(struct symbols * , struct symbols *);
 
int main()
{
    struct symbols *startPtr1 = NULL;
    struct symbols *startPtr2 = NULL;
    struct symbols *previousPtr, *currentPtr;
    char data[N];
    int i;
 
    for(i=0;i<2;i++){
        gets(data);
        read(startPtr1, data);

    }
    for(i=0;i<2;i++){
        gets(data);
        read(startPtr2, data);
    }
 
    concatenate(startPtr1,startPtr2);
 
    previousPtr = NULL;
    currentPtr  = startPtr1;
 
     while(currentPtr != NULL){
            printf("%s",currentPtr->letter);
            previousPtr = currentPtr;          // переход
            currentPtr  = currentPtr->nextPtr; //           к следующему
        }

    return 0;
}
void read(struct symbols *axe, char *data)    // функция должна заносить данные в связный список 
{ 
    struct symbols *newPtr,*previousPtr, *currentPtr;
 
    newPtr = (struct symbols*) malloc(sizeof(struct symbols));

    if(newPtr != NULL){                        // проверка памяти
        strcpy(newPtr->letter,data);           // считывание строки
        newPtr->nextPtr=NULL;                  // обнуляем указатель на конец структуры

     previousPtr = NULL;
     currentPtr  = axe;
 
     while(currentPtr != NULL){
          previousPtr = currentPtr;          // переход
          currentPtr  = currentPtr->nextPtr; //           к следующему
        }
    if (previousPtr == NULL){
        newPtr->nextPtr = axe;
        axe = newPtr;
 
      }
 
    else {
        previousPtr->nextPtr =newPtr;
        newPtr->nextPtr = currentPtr;
 
        }
 
    }
 
}
 
void concatenate(struct symbols *ptr1 , struct symbols *ptr2)
{
     struct symbols *previousPtr, *currentPtr;
 
     previousPtr = NULL;
     currentPtr  = ptr1;
 
     while(currentPtr != NULL){
            previousPtr = currentPtr;          // переход
            currentPtr  = currentPtr->nextPtr; //           к следующему
        }
 
    currentPtr=ptr2;

}
Заранее благодарен.
главный косяк, по мне так , это на 60-69 строках, проверка условаия
if (previousPtr == NULL){
        newPtr->nextPtr = axe;
        axe = newPtr;
      }
почему то всегда верная
блин перепесал обе фунции, таже проблема (
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 50
 
struct symbols{
    char letter[N];
    struct symbols *nextPtr;
 
};
void read(struct symbols*,char *);
void concatenate(struct symbols * , struct symbols *);
 
int main()
{
    struct symbols *startPtr1 = NULL;
    struct symbols *startPtr2 = NULL;
    struct symbols *currentPtr;
    char data[N];
    int i;
 
    for(i=0;i<2;i++){
        gets(data);
        read(startPtr1, data);
    }
    for(i=0;i<2;i++){
        gets(data);
        read(startPtr2, data);
    }
 
    concatenate(startPtr1,startPtr2);
    currentPtr  = startPtr1;
 
    while(currentPtr != NULL){
           printf("%s",currentPtr->letter);
           currentPtr  = currentPtr->nextPtr;
        }
 
    return 0;
}
void read(struct symbols *axe, char *data)    // функция должна заносить данные в связный список
{
    struct symbols *current=axe;
 
    while(current!=0)
        current=current->nextPtr;
 
    if(current==NULL){
        struct symbols *res;
        res = (struct symbols*)malloc(sizeof(struct symbols));
        strcpy(res->letter, data);
        res->nextPtr=axe;
        axe=res;
    }
}
void concatenate(struct symbols *ptr1 , struct symbols *ptr2)
{
     struct symbols *currentPtr=ptr1;
 
     while(currentPtr != NULL)
         currentPtr  = currentPtr->nextPtr;
 
     currentPtr=ptr2;
}

Решение задачи: «Объединение двух связных списков в один»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 50
 
struct symbols{
    char letter[N];
    struct symbols *nextPtr;
};
 
void read(struct symbols**,char *);
void concatenate(struct symbols * , struct symbols *);
 
int main()
{
    struct symbols *startPtr1 = NULL;
    struct symbols *startPtr2 = NULL;
    char data[N];
    int i;
 
    for(i=0;i<2;i++){
        gets(data);
        read(&startPtr1, data);      //считываем данные, заранее договариваемся, что их будет только по две строки
    }
    for(i=0;i<2;i++){
        gets(data);
        read(&startPtr2, data);      // и тут
    }
 
    concatenate(startPtr1,startPtr2);//вызов фунции для конкатенации
 
    if (startPtr1==NULL)
        printf("It`s empty\n");
          else{
            while(startPtr1 != NULL){               //выводим на печать связный список
                printf("%s\n",startPtr1->letter);
                startPtr1  = startPtr1->nextPtr;
               }}
   return 0;
}
void read(struct symbols **axe, char *data)  // функция должна заносить данные в связный список
{
    struct symbols *current=NULL,*pref=NULL;
    current=*axe;
 
    while(current!=NULL){                       // здесь доходим до конца списка, то есть пока не встретим нулевой указатель
        pref=current;
        current=current->nextPtr;
    }
        current = malloc(sizeof(struct symbols));   // выделяем память под структуру
        strcpy(current->letter, data);
        current->nextPtr = NULL;
        if(*axe == NULL)
          *axe=current;
            else pref->nextPtr=current;
}
void concatenate(struct symbols *ptr1 , struct symbols *ptr2)  // функция присоединяет к концу одного связного списка другой
{
     struct symbols* currentPtr = NULL;
     currentPtr=ptr1;
 
     while(currentPtr->nextPtr != NULL)
          currentPtr = currentPtr->nextPtr;
     
     currentPtr->nextPtr=ptr2;
}

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

  1. Включаемые заголовочные файлы:
    • include - для функций ввода-вывода

    • include - для функций работы с памятью

    • include - для работы со строками

    • define N 50 - определение размера буфера

  2. Структура данных:
    • struct symbols{
      • char letter[N];
      • struct symbols *nextPtr; } - структура, представляющая символ (буфер на 50 символов и указатель на следующий элемент связного списка)
  3. Функции:
    • void read(struct symbols*,char ); - функция для чтения данных из ввода и добавления их в связный список
    • void concatenate(struct symbols , struct symbols ); - функция для объединения двух связных списков
  4. Основная функция:
    • int main() - функция, с которой начинается выполнение любой программы на C
    • Создание двух пустых связных списков
    • Чтение данных и добавление их в связные списки
    • Вызов функции для объединения двух связных списков
    • Вывод на печать объединенного связного списка
  5. Функция read:
    • Создание указателя на текущий элемент связного списка
    • Проход по всем элементам связного списка до конца (до NULL)
    • Добавление нового элемента в связный список
    • Указатель на новый элемент делает ссылку на предыдущий элемент
  6. Функция concatenate:
    • Проход по всем элементам первого связного списка до конца (до NULL)
    • Добавление второго связного списка в конец первого
    • Обновление указателя на последний элемент первого связного списка
  7. Вывод на печать объединенного связного списка:
    • Проход по всем элементам объединенного связного списка
    • Вывод на печать значения поля letter каждого элемента
  8. Основная функция после вызова функции concatenate:
    • Проверка на пустой связный список
    • Если связный список пуст, выводится сообщение Its empty`
    • В противном случае, происходит проход по всем элементам связного списка и вывод на печать значения поля letter каждого элемента

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


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

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

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