Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Сортировка слиянием(1 сорт список+2 сорт список=3 сорт список)

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Сортировка слиянием(1 сорт список+2 сорт список=3 сорт список)
Имя
Сообщение << Старые топики   Новые топики >>
Сортировка слиянием(1 сорт список+2 сорт список=3 сорт список) - 2010-05-21 17:10:45.936666   
Promlol

Сообщений: 19
Оценки: 0
Присоединился: 2010-04-04 23:00:01.010000
Помогите найти ошибку уже замучалсо, итак программа:
Написать программу, составляющую по трем символьным файлам линейные упорядоченные по длине слов списки и функцию объединения списков.
   Выдать объединенный список на экран.

Функцию объединения списков такую чтобы, 3 список был отсортирован слиянием по первым двум (как понимаете только это сделать не получается)

Язык С

неправильно работает функции PLNODE merge

вот кот:
#include&lt;stdio.h&gt; #include&lt;windows.h&gt; #include&lt;stdlib.h&gt; #include&lt;string.h&gt; #define SIZE_OF_STRING 1000 #define SIZE_OF_word 100 typedef struct node //структура,экземпляр, указатель { &nbsp;&nbsp; char str[SIZE_OF_word]; &nbsp;&nbsp; struct node *next; }LNODE,*PLNODE; void insert_node(PLNODE *top,char slovo[]) //формируем список { &nbsp;&nbsp; PLNODE prev=NULL; &nbsp;&nbsp; PLNODE cur; &nbsp;&nbsp; PLNODE newp; &nbsp;&nbsp; int i; &nbsp;&nbsp; newp=(PLNODE)malloc(sizeof(LNODE)); &nbsp;&nbsp; &nbsp;&nbsp; if(*top==NULL) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i=0; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(slovo[i]!='\0') { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; newp-&gt;str[i]=slovo[i]; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; newp-&gt;str[i]='\0'; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; newp-&gt;next=NULL; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *top=newp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return; &nbsp;&nbsp; } &nbsp;&nbsp; cur=*top; &nbsp;&nbsp; while(cur) { //упорядочиваем по длине слов формируем список &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int len_pre=strlen(cur-&gt;str); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int len_new=strlen(slovo); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((len_pre&gt;len_new) &amp;&amp; (strcmp(cur-&gt;str,slovo)!=0)) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(prev==NULL) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; newp-&gt;next=*top; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i=0; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(slovo[i]!='\0') { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; newp-&gt;str[i]=slovo[i]; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; newp-&gt;str[i]='\0'; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *top=newp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i=0; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(slovo[i]!='\0') { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; newp-&gt;str[i]=slovo[i]; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; newp-&gt;str[i]='\0'; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; prev-&gt;next=newp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; newp-&gt;next=cur; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(strcmp(cur-&gt;str,slovo)==0) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; prev=cur; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cur=cur-&gt;next; &nbsp;&nbsp; } &nbsp;&nbsp; i=0; &nbsp;&nbsp; while(slovo[i]!='\0') { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; newp-&gt;str[i]=slovo[i]; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++; &nbsp;&nbsp; } &nbsp;&nbsp; newp-&gt;str[i]='\0'; &nbsp;&nbsp; prev-&gt;next=newp; &nbsp;&nbsp; newp-&gt;next=NULL; }&nbsp;&nbsp; void print_list(PLNODE top)//печать списка { &nbsp;&nbsp; PLNODE cur=top; &nbsp;&nbsp; while(cur) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("%s\n",cur-&gt;str); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cur=cur-&gt;next; &nbsp;&nbsp; } } PLNODE fgets(FILE *file) //читаем строку { &nbsp;&nbsp; char temp[SIZE_OF_STRING]; &nbsp;&nbsp; char string[SIZE_OF_STRING*1000]; &nbsp;&nbsp; char slovo[SIZE_OF_word]; &nbsp;&nbsp; int i,j; &nbsp;&nbsp; i=0; &nbsp;&nbsp; PLNODE top=NULL; &nbsp;&nbsp; while(fgets(temp,SIZE_OF_STRING,file)) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; j=0; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(temp[j]!='\n') &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string[i]=temp[j]; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; j++; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string[i]=' '; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++; &nbsp;&nbsp; } &nbsp;&nbsp; string[i]='\0'; &nbsp;&nbsp; i=0; &nbsp;&nbsp; while(string[i]!='\0') { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(string[i]==' '||string[i]=='\t') &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; j=0; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(string[i]!=' '&amp;&amp;string[i]!='\t'&amp;&amp;string[i]!='\0') { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; slovo[j]=string[i]; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; j++; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; slovo[j]='\0'; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; insert_node(&amp;top,slovo); &nbsp;&nbsp; } &nbsp;&nbsp; return top; } PLNODE merge(PLNODE *top1,PLNODE *top2,PLNODE *top3) //обьединяем 3 списка в один {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; PLNODE cur3=*top3; &nbsp;&nbsp; PLNODE cur=*top1; &nbsp;&nbsp; PLNODE cur2=*top2; &nbsp;&nbsp; int len_pre; &nbsp;&nbsp; int len_new; &nbsp;&nbsp; PLNODE newp; &nbsp;&nbsp; &nbsp;&nbsp; for( ; ; ) &nbsp;&nbsp; { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((cur!=NULL)) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; len_pre=strlen(cur-&gt;str); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((cur==NULL) &amp;&amp; ((cur2!=NULL))) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; len_pre=len_new+1; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((cur2!=NULL)) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; len_new=strlen(cur2-&gt;str); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((cur2==NULL) &amp;&amp; ((cur!=NULL))) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; len_new=len_pre+1; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((cur==NULL) &amp;&amp; (cur2==NULL)){ &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return *top3; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((len_pre!=0 &amp;&amp; len_new==0)) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cur2=cur2-&gt;next; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; len_new=strlen(cur2-&gt;str); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((len_pre==0 &amp;&amp; len_new==0)) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cur=cur-&gt;next; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cur2=cur2-&gt;next; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; len_pre=strlen(cur-&gt;str); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; len_new=strlen(cur2-&gt;str); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((len_pre&gt;len_new)) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(*top3!=NULL) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *top3=cur2; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cur3=*top3; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cur3=cur3-&gt;next; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(*top3==NULL) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *top3=cur2; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cur3=*top3; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cur3=cur3-&gt;next; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cur2=cur2-&gt;next; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(*top3!=NULL) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *top3=cur; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cur3=*top3; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cur3=cur3-&gt;next; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(*top3==NULL) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *top3=cur; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cur3=*top3; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cur3=cur3-&gt;next; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cur=cur-&gt;next; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; } } void main(void) { &nbsp;&nbsp; FILE *file1; &nbsp;&nbsp; FILE *file2; &nbsp;&nbsp; FILE *file3; &nbsp;&nbsp; file1=fopen("D:/abc.txt","rt"); &nbsp;&nbsp; PLNODE top1; &nbsp;&nbsp; top1 = fgets(file1); &nbsp;&nbsp; printf("\nlist 1\n===================\n"); &nbsp;&nbsp; print_list(top1); &nbsp;&nbsp; &nbsp;&nbsp; file2=fopen("D:/def.txt","rt"); &nbsp;&nbsp; PLNODE top2; &nbsp;&nbsp; top2 = fgets(file2); &nbsp;&nbsp; printf("\nlist 2\n===================\n"); &nbsp;&nbsp; print_list(top2); &nbsp;&nbsp; &nbsp;&nbsp; file3=fopen("D:/ghi.txt","rt"); &nbsp;&nbsp; PLNODE top3; &nbsp;&nbsp; top3 = fgets(file3); &nbsp;&nbsp; printf("\nlist 3\n===================\n"); &nbsp;&nbsp; print_list(top3); &nbsp;&nbsp; printf("\nlists 1+2\n===================\n"); &nbsp;&nbsp; &nbsp;&nbsp; PLNODE top_1_2,top_12_3,topmerge=NULL,topmerge2=NULL; &nbsp;&nbsp; top_1_2=merge(&amp;top1,&amp;top2,&amp;topmerge); &nbsp;&nbsp; print_list(top_1_2); &nbsp;&nbsp; //printf("\nlists (1+2)+3\n===================\n"); &nbsp;&nbsp; //top_12_3=merge(&amp;top_1_2,&amp;top3,&amp;topmerge2); &nbsp;&nbsp; //print_list(top_12_3); }
Post #: 1
RE: Сортировка слиянием(1 сорт список+2 сорт список=3 сорт список) - 2010-05-21 17:11:46.823333   
Promlol

Сообщений: 19
Оценки: 0
Присоединился: 2010-04-04 23:00:01.010000
где ошибка?((
Post #: 2
RE: Сортировка слиянием(1 сорт список+2 сорт список=3 сорт список) - 2010-05-21 18:08:25.130000   
Parano1d

Сообщений: 423
Оценки: 0
Присоединился: 2008-05-21 13:40:17.093333
quote:

for( ; ; )

это типа while(true)?
Post #: 3
RE: Сортировка слиянием(1 сорт список+2 сорт список=3 сорт список) - 2010-05-21 18:22:40.250000   
Promlol

Сообщений: 19
Оценки: 0
Присоединился: 2010-04-04 23:00:01.010000
незнаю что значит while(true), запускаемся в бесконечный цикл, и

if((cur==NULL) &amp;&amp; (cur2==NULL)){ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return *top3; &nbsp;&nbsp;&nbsp; } позволяет из него выйти
Post #: 4
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Сортировка слиянием(1 сорт список+2 сорт список=3 сорт список)







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.