сортировка связанного списка - PullRequest
0 голосов
/ 24 сентября 2010

Я пытаюсь создать функцию, которая сортирует связанный список, который сортирует список по именам.

struct student
 {
  char name[50];
  int roll_no;
  struct student *ptr_next;
 }*ptr_this,*ptr_first;/*ptr first points to first pointer */
void SortRecord(void)
{
 struct student *out,*in,*temp;
 for(out=ptr_first;out!=(struct student*)NULL;out=out->ptr_next)
 {
  for(in=out->ptr_next;out->ptr_next!=(struct student*)NULL;in=in->ptr_next)
  {
   if(strcmpi(out->name,in->name)<0)

  temp->ptr_next=in->ptr_next;
  in->ptr_next=out->ptr_next;
  out->ptr_next=temp->ptr_next;/*The program stops at this instant and does not proceed after this line*/
  }
 }
 printf("Records have been successfully sorted.");

Я застрял с двумя вопросами: РЕДАКТИРОВАТЬ: Я понял, чтонам нужно только поменять местами указатели, а не содержимое, но мой код все еще зависает при обмене в указанном выше месте.

Ответы [ 5 ]

2 голосов
/ 24 сентября 2010

Если вы знаете, что результат должен быть отсортирован, попробуйте вместо сортировки вставить список.В зависимости от ваших требований к конструкции допускается использование тяжелой вставки, поскольку этап «сортировки» становится излишним.Эта концепция также может быть немного проще для понимания.

1 голос
/ 24 сентября 2010

Вы действительно это имеете в виду?

if(strcmpi(out->name,in->name)<0)
  temp->ptr_next=in->ptr_next;

in->ptr_next=out->ptr_next;
out->ptr_next=temp->ptr_next;

Или ты этого хочешь?

if(strcmpi(out->name,in->name)<0)
{
  temp->ptr_next=in->ptr_next;
  in->ptr_next=out->ptr_next;
  out->ptr_next=temp->ptr_next;
}

Я думаю, что вы пытались разыменовать temp и temp могли быть неинициализированы (struct student *out,*in,*temp;). Попробуйте использовать отладчик!

1 голос
/ 24 сентября 2010

Эй, я думаю, вы должны нарисовать список и указатель на листе бумаги и проанализировать его

*temp=*in; *in=*out; 
*out=*temp; 
temp->ptr_next=in->ptr_next;

После выполнения этих строк temp->ptr_next == temp:)

1 голос
/ 24 сентября 2010

В виде связанного списка, вам все равно нужно только переместить ptr_next. Я не знаю, почему вы делаете копию участника с

*temp=*in;
*in=*out;
*out=*temp;

Таким образом, у вас не будет проблем с нулевым ptr_next, поскольку вы будете менять их местами, и только последний узел будет указывать на NULL, что верно.

0 голосов
/ 24 сентября 2010

Вы действительно хотите отсортировать ссылки?Вы можете попробовать поменять имя и роллно во время сортировки ---

1,a->2,m->3,p->4,d
 ==> sort the names ... 
     inner loop (swap the roll no and names, leave pointers as it is.... )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...