Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2010, 23:49   #1
Promolol
 
Регистрация: 21.05.2010
Сообщений: 5
По умолчанию Сортировка слиянием(1 сорт список+2 сорт список=3 сорт список)

Помогите найти ошибку уже замучалсо, итак прога:
Написать программу, составляющую по трем символьным файлам линейные упорядоченные по длине слов списки и функцию объединения списков.
Выдать объединенный список на экран.

Функцию объединения списков такую чтобы, 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 удалил(нет места)
Promolol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++] Челночная сортировка / Список xXxGrafffxXx Общие вопросы C/C++ 24 17.06.2009 00:18
C++. Односвязный список. Уничтожить список Olya90 Помощь студентам 2 10.06.2009 18:52
Список. Сортировка werser Помощь студентам 1 28.05.2009 02:20
Данные-проверка-список (список на другом листе) Inbox Microsoft Office Excel 7 26.12.2008 01:43
Сорт.дерево и пирамидальная сортировка Санёк20 Паскаль, Turbo Pascal, PascalABC.NET 1 25.02.2008 18:22