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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2010, 20:06   #1
amerhant
Пользователь
 
Регистрация: 19.10.2009
Сообщений: 24
По умолчанию Сортировка односвязного списка

Посмотрите пожалуйста свежим взглядом на функцию sort не могу понять что не правильно она зациклятся(((
Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <iostream.h>
struct Node{
	int d;
	char *NM;
	Node *next;
};
Node * first(FILE * fp){
	int d;
	fscanf(fp,"%d",&d);
	char str[50];
	fgets(str,50,fp);
	int strln=strlen(str);
	Node *pv=new Node;
	pv->NM=new char [strln+1];
	strcpy(pv->NM,str);
	pv->d=d; pv->next=0;
	return pv;
}
void add(Node **pend, FILE * fp){
	int d;
	fscanf(fp,"%d",&d);
	char str[50];
	fgets(str,50,fp);
	int strln=strlen(str);
	Node *pv=new Node;
	pv->NM=new char [strln+1];
	strcpy(pv->NM,str);
	pv->d=d; pv->next=0;
	(*pend)->next=pv;
	*pend=pv;
}
void sort(Node **pbeg,Node **pend)
{
Node *f=*pbeg;
Node *temp=0;
Node *tmp=0;
Node *pv=f->next;
int l=0;
int min;
while (f->next){
min=f->d;
l=0;
pv=f->next;
while(pv){
	if(pv->d<min)
	{
	min=pv->d;
	l++;
	tmp=pv;
	}
pv=pv->next;
}
	if(l>0)
	{
		if(f==*pbeg) {*pbeg=tmp;}
		temp=f->next;
		f->next=tmp->next;
		tmp->next=temp;
		f=temp;
	}
	else {f=f->next;}
	}

}
void print(Node *pv)
{
while (pv){
	printf("%d %s",pv->d,pv->NM);
	pv=pv->next;
	}
}

int main(){
clrscr();
FILE * fp;
fp=fopen("D:\\WORK\\TC\\7.txt","r+");
if (fp==NULL)
{
	printf("Ochibka otkritia fila 7.txt");
}
Node *pbeg=first(fp);
Node *pend=pbeg;
while(!feof(fp))
{
add(&pend,fp);
}
Node *pv=pbeg;
print(pv);
printf("\n\n");
sort(&pbeg,&pend);
print(pv);
	fclose(fp);
	while(pv)
	{
	delete[]pv->NM;
	pv=pv->next;
	}
	getch();
	return 0;
}
amerhant вне форума Ответить с цитированием
Старый 13.05.2010, 20:25   #2
blackbanny
Форумчанин
 
Аватар для blackbanny
 
Регистрация: 02.10.2009
Сообщений: 104
По умолчанию

что то у тебя много кода, попробуй переделать сортировку методом вставок по аналогии:
Код:
list *sort(list *ph)			// функция возвращает заголовок нового списка
 { list *q, *out, *p , *pr;
 out = NULL;                    // выходной список пуст
 while (ph !=NULL)              // пока не пуст входной список
	  { q = ph; ph = ph->next;  // исключить очередной
								// поиск места включения
	  for ( p=out,pr=NULL; p!=NULL && q->val>p->val; pr=p,p=p->next);
	  if (pr==NULL)             // включение перед первым
		   { q->next=out; out=q; }
	  else                      // иначе после предыдущего
		   { q->next=p; pr->next=q; }
	  }
 return out; }
blackbanny вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
СИ. Списки. Описание структуры односвязного списка Jane-sad Помощь студентам 9 17.05.2010 14:40
Мин. элемент. односвязного списка в СИ Sultan237 Общие вопросы C/C++ 0 22.03.2010 23:24
Сортировка односвязного списка btf Общие вопросы C/C++ 0 15.02.2010 14:40
Сортировка списка DOJ Общие вопросы C/C++ 3 23.08.2009 19:36
Cортировка односвязного списка alesfoss Общие вопросы C/C++ 3 30.03.2009 19:46