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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2012, 20:21   #1
Cinnamon
Новичок
Джуниор
 
Регистрация: 10.01.2012
Сообщений: 2
По умолчанию списки с++

Помогите, кто может
Есть код:
Код:
#include <locale.h>
#include <stdio.h>


struct Single_List {
int Data; 
Single_List *Next; 
};

void Make_Single_List(int n,Single_List** Head);
void Print_Single_List(Single_List* Head);
Single_List* Insert_Item_Single_List(Single_List* Head,int Number, int DataItem);
Single_List* Delete_Item_Single_List(Single_List* Head,int Number);
void Delete_Single_List(Single_List* Head);
void Sort_Single_List(Single_List* Head, int n, int Number);

using namespace std;



int _tmain(int argc, _TCHAR* argv[])
{
	
    int Number, DataItem, n=7;
	Single_List *Head; //указатель на первый элемент списка
    
	setlocale (LC_ALL, "RUSSIAN");	
	cout<<"Введите значение: "<<endl
		<<"1-для создания нового списка"<<endl
		<<"2-для вставки элемента с заданным номером"<<endl
		<<"3-для удаления элемента с заданным номером"<<endl
		<<"4-для печати одноправленного списка"<<endl
		<<"5-для выхода из программы"<<endl;
		
	int m;
	cin>>m;
	while (m!=5){
	 switch (m){
      case 1: Make_Single_List(n,&Head);
		      break;
	  case 2: cout<<"Введите номер элемента для вставки и его значение"<<endl;
		      cin>>Number>>DataItem;
		      Insert_Item_Single_List(Head,Number,DataItem);			  
		      break;
	  case 3: cout<<"Введите номер элемента для удаления"<<endl;
		      cin>>Number;
		      Delete_Item_Single_List(Head,Number);			  
		      break;
	  case 4: Print_Single_List(Head);
		      break;	  
	  default:cout<<"Неправильный выбор"<<endl;
		      break;
	}
    cout<<"Введите значение: "<<endl
	<<"1-для создания нового списка"<<endl
	<<"2-для вставки элемента с заданным номером"<<endl
	<<"3-для удаления элемента с заданным номером"<<endl
	<<"4-для печати одноправленного списка"<<endl
	<<"5-для выхода из программы"<<endl;
	
	 cin>>m;	 
	}
	Delete_Single_List(Head);
	return 0;
}
void Make_Single_List(int n,Single_List** Head){
if (n > 0) {
    (*Head) = new Single_List();
//выделяем память под новый элемент
cout<< "Введите значение ";
cin>> (*Head)->Data;
    //вводим значение информационного поля
    (*Head)->Next=NULL;//обнуление адресного поля
Make_Single_List(n-1,&((*Head)->Next));
}
}
//печать однонаправленного списка
void Print_Single_List(Single_List* Head) {
if (Head != NULL) {
cout<< Head->Data << "\t";
Print_Single_List(Head->Next);
//переход к следующему элементу
  }
else
cout<< "\n";
}
/*вставка элемента с заданным номером в однонаправленный список*/
Single_List* Insert_Item_Single_List(Single_List* Head, 
int Number, int DataItem){ 
  Number--;
Single_List *NewItem=new(Single_List);
NewItem->Data=DataItem; 
NewItem->Next = NULL;
if (Head == NULL) {//список пуст
Head = NewItem;//создаем первый элемент списка
}
else {//список не пуст
Single_List *Current=Head;
for(int i=1; i < Number && Current->Next!=NULL; i++)
    Current=Current->Next;
if (Number == 0){
//вставляем новый элемент на первое место
NewItem->Next = Head;
      Head = NewItem;
}
else {//вставляем новый элемент на не первое место
if (Current->Next != NULL) 
	NewItem->Next = Current->Next;
      Current->Next = NewItem;
    }
  }
return Head; 
}
/*удаление элемента с заданным номером из однонаправленного списка*/
Single_List* Delete_Item_Single_List(Single_List* Head, 
int Number){
Single_List *ptr;//вспомогательный указатель
Single_List *Current = Head;
for (int i = 1; i < Number && Current != NULL; i++)
    Current = Current->Next;
if (Current != NULL){//проверка на корректность
if (Current == Head){//удаляем первый элемент
      Head = Head->Next;
delete(Current);
      Current = Head;
    }
else {//удаляем не первый элемент
ptr = Head;
while (ptr->Next != Current)
ptr = ptr->Next; 
ptr->Next = Current->Next;
delete(Current);
      Current=ptr;
    }
  }
return Head;
}
/*освобождение памяти, выделенной под однонаправленный список*/
void Delete_Single_List(Single_List* Head){
if (Head != NULL){
Delete_Single_List(Head->Next);
delete Head;
  }
}
Помогите добавить функцию, которая могла бы преобразовать список таким образом, чтобы в первой половине располагались элементы,
стоящие в нечетных позициях, а во второй половине в четной.
По логике понимаю, что нужно просто их удалить с определенных позиций и вставить в конец списка, но возникли проблемы с указателями.

Последний раз редактировалось alex_fcsm; 10.01.2012 в 20:47.
Cinnamon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Списки BornOfOsiris Помощь студентам 0 15.05.2011 15:34
списки BornOfOsiris Помощь студентам 0 12.05.2011 22:57
Списки BornOfOsiris Помощь студентам 0 12.05.2011 20:02
Списки Walter Помощь студентам 1 06.12.2009 16:03