Объединение двух связных списков в один - 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:
- Проверка на пустой связный список
- Если связный список пуст, выводится сообщение
Its empty` - В противном случае, происходит проход по всем элементам связного списка и вывод на печать значения поля
letterкаждого элемента