AbhiSingh2210 Ответов: 2

В односвязном списке длины n разделите нечетные и четные индексированные элементы на 2 списка с индексацией, начинающейся с 1.no новые узлы для новых списков.


#include<stdio.h>
#include<stdlib.h>
struct node
{
	int info;
	struct node *link;
};
typedef struct node *Node;
Node even=NULL;  
Node odd=NULL;
Node list=NULL;
void add(int info)
{
	Node temp=(node)malloc(sizeof struct node);
	Node curr;
	temp-> info=info;
	temp-> link=NULL;
	if (list==NULL)
	{
		list=temp;
		return;
	}
	curr=list;
	while(curr->link!=NULL)
		curr=curr -> link;
		curr->link=temp;
}
void display(node head)
{
	node ptr = head;
	printf("[head]=>");
	while (ptr!=NULL)
	{
		printf("%d=>",ptr->info);
		ptr=ptr -> link;
	}
	printf("[null]\n");
}
void split()
{
	node temp;
	node curr; 
   while(list!=NULL)
   {
   	node temp=(node)malloc(sizeof(struct node));
   	temp-> info=list-> info;
   	temp -> link=NULL;
   	if(list->info%2==0)
   	{
   		if(even==NULL)
   		{
   			even=temp;
   			list=list->link;
   			continue;
   	    }
		else
		{
			curr=even;
			while(curr->link!=NULL)
			curr=curr->link;
			curr->link=temp;	
		}
		list=list->link;
	}
	else{
			if(odd==NULL)
			{
				odd=temp;
				list=list->link;
				continue;
			}
			else{
					curr=odd;
					while(curr->link!=NULL)
					 curr =curr->link;
					 curr->link=temp;
			}
				list=list->link;
			}
	  	 }
   		}
   	{
    int i,n;
    printf("\n Enter the number of nodes to be inserted in the list");
    scanf("%d",&n);
    for(i=0;i<=n;i++)
        add(i);
    printf("\n Complete list:\n");
    display(list);
    split();
    printf("\n ODD indexed elements");
    printf("\n odd:");
    display(odd);
    printf("\nEven indexed elements");
    printf("\n Even:");
    display(even);
    return 0;	
}


Что я уже пробовал:

Не могли бы вы мне помочь, объяснив, что я здесь делаю не так?
Это было бы очень кстати.
Спасибо.

Richard MacCutchan

- Вы можете мне помочь, объяснив, что я здесь делаю не так?"
Поскольку вы не сказали нам, в чем проблема, трудно догадаться.

2 Ответов

Рейтинг:
2

CPallini

Ваш код почти работает. Исправление ошибок, которые вы можете получить

#include<stdio.h>
#include<stdlib.h>
struct Node
{
  int info;
  struct Node *link;
};

typedef struct Node *NodePtr;

NodePtr even = NULL;
NodePtr odd = NULL;
NodePtr list = NULL;

void add(int info)
{
  NodePtr temp=(NodePtr)malloc(sizeof (struct Node));
  NodePtr curr;
  temp->info = info;
  temp->link = NULL;
  if (list == NULL)
  {
    list = temp;
    return;
  }
  curr = list;
  while(curr->link != NULL)
    curr = curr->link;
  curr->link = temp;
}

void display(NodePtr head)
{
  NodePtr ptr = head;
  printf("[head]=>");
  while (ptr != NULL)
  {
    printf("%d=>", ptr->info);
    ptr = ptr -> link;
  }
  printf("[null]\n");
}

void split()
{
  NodePtr curr;
  while ( list != NULL )
  {
    NodePtr temp= (NodePtr) malloc( sizeof (struct Node));
    temp->info = list->info;
    temp->link = NULL;
    if ( list->info % 2 == 0 )
    {
      if ( even == NULL )
      {
        even = temp;
      }
      else
      {
        curr =  even;
        while( curr->link != NULL)
          curr=curr->link;
        curr->link = temp;
      }
      list = list->link;
    }
    else
    {
      if (odd == NULL )
      {
        odd = temp;
      }
      else
      {
        curr = odd;
        while( curr->link != NULL)
          curr =curr->link;
        curr->link=temp;
      }
      list=list->link;
    }
   }
 }

int main()
{
    int i,n;
    printf("\n Enter the number of Nodes to be inserted in the list");
    scanf("%d",&n);
    for(i=0;i<=n;i++)
        add(i);
    printf("\n Complete list:\n");
    display(list);
    split();
    printf("\n ODD indexed elements");
    printf("\n odd:");
    display(odd);
    printf("\n EVEN indexed elements");
    printf("\n Even:");
    display(even);
    return 0;
}



Обобщая add функция (как вы уже сделали с помощью display во-первых, вы можете добиться более компактного кода:
#include<stdio.h>
#include<stdlib.h>

struct Node
{
  int info;
  struct Node *link;
};

typedef struct Node *NodePtr;

NodePtr even = NULL;
NodePtr odd = NULL;
NodePtr list = NULL;

NodePtr add(NodePtr head, int info)
{
  NodePtr temp = (NodePtr) malloc(sizeof (struct Node) );
  NodePtr curr;
  temp->info = info;
  temp->link = NULL;
  if (head == NULL)
  {
    head = temp;
  }
  else
  {
    curr = head;
    while(curr->link != NULL)
      curr = curr->link;
    curr->link = temp;
  }
  return head;
}

void display(NodePtr head)
{
  NodePtr ptr = head;
  printf("[head]=>");
  while (ptr != NULL)
  {
    printf("%d=>", ptr->info);
    ptr = ptr -> link;
  }
  printf("[null]\n");
}

void split()
{
  while ( list != NULL )
  {
    if ( (list->info % 2 == 0) )
      even = add(even, list->info);
    else
      odd = add(odd, list->info);
    list = list->link;
  }
}

int main()
{
  int i,n;
  printf("\n Enter the number of Nodes to be inserted in the list");
  scanf("%d",&n);
  for(i=0;i<=n;i++)
    list = add(list, i);
  printf("\n Complete list:\n");
  display(list);
  split();
  printf("\n ODD indexed elements");
  printf("\n odd:");
  display(odd);
  printf("\n EVEN indexed elements");
  printf("\n Even:");
  display(even);

  return 0;
}


Рейтинг:
1

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали электронное письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!