Объединение двух связных списков в один - 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; }
Объяснение кода листинга программы
- Включаемые заголовочные файлы:
-
include
- для функций ввода-вывода -
include
- для функций работы с памятью -
include
- для работы со строками -
define N 50 - определение размера буфера
-
- Структура данных:
- struct symbols{
- char letter[N];
- struct symbols *nextPtr; } - структура, представляющая символ (буфер на 50 символов и указатель на следующий элемент связного списка)
- struct symbols{
- Функции:
- void read(struct symbols*,char ); - функция для чтения данных из ввода и добавления их в связный список
- void concatenate(struct symbols , struct symbols ); - функция для объединения двух связных списков
- Основная функция:
- int main() - функция, с которой начинается выполнение любой программы на C
- Создание двух пустых связных списков
- Чтение данных и добавление их в связные списки
- Вызов функции для объединения двух связных списков
- Вывод на печать объединенного связного списка
- Функция read:
- Создание указателя на текущий элемент связного списка
- Проход по всем элементам связного списка до конца (до NULL)
- Добавление нового элемента в связный список
- Указатель на новый элемент делает ссылку на предыдущий элемент
- Функция concatenate:
- Проход по всем элементам первого связного списка до конца (до NULL)
- Добавление второго связного списка в конец первого
- Обновление указателя на последний элемент первого связного списка
- Вывод на печать объединенного связного списка:
- Проход по всем элементам объединенного связного списка
- Вывод на печать значения поля
letter
каждого элемента
- Основная функция после вызова функции concatenate:
- Проверка на пустой связный список
- Если связный список пуст, выводится сообщение
It
s empty` - В противном случае, происходит проход по всем элементам связного списка и вывод на печать значения поля
letter
каждого элемента
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д