Помогите найти ошибку уже замучалсо, итак прога:
Написать программу, составляющую по трем символьным файлам линейные упорядоченные по длине слов списки и функцию объединения списков.
Выдать объединенный список на экран.
Функцию объединения списков такую чтобы, 3 список был отсортирован слиянием по первым двум (как понимаете только это сделать не получается)
Язык С
неправильно работает функции PLNODE merge, помогите плизз
вот кот:
Код:
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<string.h>
#define SIZE_OF_STRING 1000
#define SIZE_OF_word 100
typedef struct node //структура,экземпляр, указатель
{
char str[SIZE_OF_word];
struct node *next;
}LNODE,*PLNODE;
void insert_node(PLNODE *top,char slovo[]) //формируем список
{
PLNODE prev=NULL;
PLNODE cur;
PLNODE newp;
int i;
newp=(PLNODE)malloc(sizeof(LNODE));
if(*top==NULL) {
i=0;
while(slovo[i]!='\0') {
newp->str[i]=slovo[i];
i++;
}
newp->str[i]='\0';
newp->next=NULL;
*top=newp;
return;
}
cur=*top;
while(cur) { //упорядочиваем по длине слов формируем список
int len_pre=strlen(cur->str);
int len_new=strlen(slovo);
if((len_pre>len_new) && (strcmp(cur->str,slovo)!=0)) {
if(prev==NULL) {
newp->next=*top;
i=0;
while(slovo[i]!='\0') {
newp->str[i]=slovo[i];
i++;
}
newp->str[i]='\0';
*top=newp;
return;
}
i=0;
while(slovo[i]!='\0') {
newp->str[i]=slovo[i];
i++;
}
newp->str[i]='\0';
prev->next=newp;
newp->next=cur;
return;
}
if(strcmp(cur->str,slovo)==0)
return;
prev=cur;
cur=cur->next;
}
i=0;
while(slovo[i]!='\0') {
newp->str[i]=slovo[i];
i++;
}
newp->str[i]='\0';
prev->next=newp;
newp->next=NULL;
}
PLNODE fgets(FILE *file) //читаем строку
{
char temp[SIZE_OF_STRING];
char string[SIZE_OF_STRING*1000];
char slovo[SIZE_OF_word];
int i,j;
i=0;
PLNODE top=NULL;
while(fgets(temp,SIZE_OF_STRING,file)) {
j=0;
while(temp[j]!='\n')
{
string[i]=temp[j];
i++;
j++;
}
string[i]=' ';
i++;
}
string[i]='\0';
i=0;
while(string[i]!='\0') {
while(string[i]==' '||string[i]=='\t')
i++;
j=0;
while(string[i]!=' '&&string[i]!='\t'&&string[i]!='\0') {
slovo[j]=string[i];
i++;
j++;
}
slovo[j]='\0';
insert_node(&top,slovo);
}
return top;
}
PLNODE merge(PLNODE *top1,PLNODE *top2,PLNODE *top3) //обьединяем 3 списка в один
{
PLNODE cur3=*top3;
PLNODE cur=*top1;
PLNODE cur2=*top2;
int len_pre;
int len_new;
PLNODE newp;
for( ; ; )
{
if((cur!=NULL))
len_pre=strlen(cur->str);
if((cur==NULL) && ((cur2!=NULL)))
len_pre=len_new+1;
if((cur2!=NULL))
len_new=strlen(cur2->str);
if((cur2==NULL) && ((cur!=NULL)))
len_new=len_pre+1;
if((cur==NULL) && (cur2==NULL)){
return *top3;
}
if((len_pre!=0 && len_new==0)) {
cur2=cur2->next;
len_new=strlen(cur2->str);
}
if((len_pre==0 && len_new==0)) {
cur=cur->next;
cur2=cur2->next;
len_pre=strlen(cur->str);
len_new=strlen(cur2->str);
}
if((len_pre>len_new)) {
if(*top3!=NULL) {
*top3=cur2;
cur3=*top3;
cur3=cur3->next;
}
if(*top3==NULL) {
*top3=cur2;
cur3=*top3;
cur3=cur3->next;
}
cur2=cur2->next;
}
else {
if(*top3!=NULL) {
*top3=cur;
cur3=*top3;
cur3=cur3->next;
}
if(*top3==NULL) {
*top3=cur;
cur3=*top3;
cur3=cur3->next;
}
cur=cur->next;
}
}
}
void main(void)
{
FILE *file1;
FILE *file2;
FILE *file3;
file1=fopen("D:/abc.txt","rt");
PLNODE top1;
top1 = fgets(file1);
printf("\nlist 1\n===================\n");
print_list(top1);
file2=fopen("D:/def.txt","rt");
PLNODE top2;
top2 = fgets(file2);
printf("\nlist 2\n===================\n");
print_list(top2);
printf("\nlists 1+2\n===================\n");
PLNODE top_1_2,topmerge=NULL,topmerge2=NULL;
top_1_2=merge(&top1,&top2,&topmerge);
print_list(top_1_2);
}
функц. printlist удалил(нет места)