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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2009, 16:19   #1
aka_Kiss
Пользователь
 
Аватар для aka_Kiss
 
Регистрация: 23.10.2009
Сообщений: 33
Подмигивание линейный односвязный список на С - что это?? о_О

Люди, помогите разобраться со связными структурами данных, а именно с линейным односвязным списком.
Очень-очень нужно написать программку по этой теме.

Вот задание:
Цитата:
Необходимо реализовать класс для линейного односвязного списка и таких операций над ним: создание, уничтожение, вывод содержимого, добавление элемента в произвольное место, удаление из конца, проверка на наличие элемента.
Жду хоть каких-то подсказок. ^_^
keep it simple
aka_Kiss вне форума Ответить с цитированием
Старый 16.12.2009, 23:00   #2
aka_Kiss
Пользователь
 
Аватар для aka_Kiss
 
Регистрация: 23.10.2009
Сообщений: 33
По умолчанию

Код:
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>

class Spisok
{
  private:
    struct node
      {
        int elem; 
        node *sled;
      } *phead; //Указатель на начало списка
  public: 
    Spisok() 
    {
      phead = new (node); 
      (*phead).sled=NULL;
    } //Конструктор
    ~Spisok() 
    { 
      delete phead; 
    } //Деструктор
    void POSTROENIE (); 
    void VYVOD (); 
    void DOBAVLENIE ();
    void UDALENIE ();
    void PROVERKA ();
    void OCHISTKA ();
}; 


//Построение однонаправленного линейного списка 
//с заглавным звеном
// phead - указатель на заглавное звено списка  
void Spisok::POSTROENIE ()
{
  node *t;
  int el;
  t = phead;
  cout<< "Вводите элементы списка: ";
  cin>>el;
  while (el!=0)
  { 
    (*t).sled = new (node); 
    t = (*t).sled; (*t).elem = el; (*t).sled = NULL; 
    cin>>el;
  }
} 


//Вывод содержимого однонаправленного линейного списка
//с заглавным звеном
// phead - указатель на заглавное звено списка 
void Spisok::VYVOD ()
{
  node *t;
  t = (*phead).sled; 
  cout<<"Список: ";
  while (t!=NULL)
  { 
    cout<<(*t).elem<<" "; 
    t = (*t).sled;
  }
  cout<<endl;
}

//Добавление в произвольное место
//элемента однонаправленного линейного списка
//с заглавным звеном
// phead - указатель на заглавное звено списка 
void Spisok::DOBAVLENIE ()


//Удаление из конца
//элемента однонаправленного линейного списка
//с заглавным звеном
// phead - указатель на заглавное звено списка 
void Spisok::UDALENIE ()


//Проверка на наличие
//элемента однонаправленного линейного списка
//с заглавным звеном
// phead - указатель на заглавное звено списка 
void Spisok::PROVERKA ()

//Удаление из памяти однонаправленного линейного списка 
//с заглавным звеном
// phead - указатель на заглавное звено списка 
void Spisok::OCHISTKA ()
{
  node *q,*q1;// Рабочие указатели
  q = phead;
  q1 = (*q).sled; // Указатель q1 "опережает" указатель q.
  while (q1!=NULL)
  { 
    q = q1; 
    q1 = (*q1).sled; 
    delete q;
  }
};
 
int main ()
{
  clrscr();
  
  Spisok A;
 
  A.POSTROENIE ();
  A.VYVOD ();
  A.DOBAVLENIE ();
  A.UDALENIE ();
  A.PROVERKA ();
  A.OCHISTKA ();
  
  return 0;
}
Я попробывала создать, вывести элементы и удалить список. Как дописать добавление элемента в произвольное место, удаление из конца, проверка на наличие элемента?
Помогите, плиз))
keep it simple
aka_Kiss вне форума Ответить с цитированием
Старый 16.12.2009, 23:01   #3
aka_Kiss
Пользователь
 
Аватар для aka_Kiss
 
Регистрация: 23.10.2009
Сообщений: 33
По умолчанию

Код:
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>

class Spisok
{
  private:
    struct node
      {
        int elem; 
        node *sled;
      } *phead; //Указатель на начало списка
  public: 
    Spisok() 
    {
      phead = new (node); 
      (*phead).sled=NULL;
    } //Конструктор
    ~Spisok() 
    { 
      delete phead; 
    } //Деструктор
    void POSTROENIE (); 
    void VYVOD (); 
    void DOBAVLENIE ();
    void UDALENIE ();
    void PROVERKA ();
    void OCHISTKA ();
}; 


//Построение однонаправленного линейного списка 
//с заглавным звеном
// phead - указатель на заглавное звено списка  
void Spisok::POSTROENIE ()
{
  node *t;
  int el;
  t = phead;
  cout<< "Вводите элементы списка: ";
  cin>>el;
  while (el!=0)
  { 
    (*t).sled = new (node); 
    t = (*t).sled; (*t).elem = el; (*t).sled = NULL; 
    cin>>el;
  }
} 


//Вывод содержимого однонаправленного линейного списка
//с заглавным звеном
// phead - указатель на заглавное звено списка 
void Spisok::VYVOD ()
{
  node *t;
  t = (*phead).sled; 
  cout<<"Список: ";
  while (t!=NULL)
  { 
    cout<<(*t).elem<<" "; 
    t = (*t).sled;
  }
  cout<<endl;
}

//Добавление в произвольное место
//элемента однонаправленного линейного списка
//с заглавным звеном
// phead - указатель на заглавное звено списка 
void Spisok::DOBAVLENIE ()


//Удаление из конца
//элемента однонаправленного линейного списка
//с заглавным звеном
// phead - указатель на заглавное звено списка 
void Spisok::UDALENIE ()


//Проверка на наличие
//элемента однонаправленного линейного списка
//с заглавным звеном
// phead - указатель на заглавное звено списка 
void Spisok::PROVERKA ()

//Удаление из памяти однонаправленного линейного списка 
//с заглавным звеном
// phead - указатель на заглавное звено списка 
void Spisok::OCHISTKA ()
{
  node *q,*q1;// Рабочие указатели
  q = phead;
  q1 = (*q).sled; // Указатель q1 "опережает" указатель q.
  while (q1!=NULL)
  { 
    q = q1; 
    q1 = (*q1).sled; 
    delete q;
  }
};
 
int main ()
{
  clrscr();
  
  Spisok A;
 
  A.POSTROENIE ();
  A.VYVOD ();
  A.DOBAVLENIE ();
  A.UDALENIE ();
  A.PROVERKA ();
  A.OCHISTKA ();
  
  return 0;
}
Я попробывала создать, вывести элементы и удалить список. Как дописать добавление элемента в произвольное место, удаление из конца, проверка на наличие элемента?
Помогите, плиз))
keep it simple
aka_Kiss вне форума Ответить с цитированием
Старый 17.12.2009, 03:38   #4
aka_Kiss
Пользователь
 
Аватар для aka_Kiss
 
Регистрация: 23.10.2009
Сообщений: 33
По умолчанию

Код:
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>

class Spisok
{
  private:
    struct node
    {
	  int elem;
	  node *sled;
    } *phead; //Указатель на начало списка
  public:
    Spisok()
    {
      phead = new (node);
      (*phead).sled=NULL;
    } //Конструктор
    ~Spisok()
    {
      delete phead;
    } //Деструктор
    void POSTROENIE ();
    void VYVOD ();
    void DOBAVLENIE ();
    void UDALENIE ();
    void PROVERKA ();
    void OCHISTKA ();
};


//Построение однонаправленного линейного списка
//с заглавным звеном
// phead - указатель на заглавное звено списка
void Spisok::POSTROENIE ()
{
  node *t;
  int el;
  t = phead;
  cout<< "Вводите элементы списка: ";
  cin>>el;
  while (el!=0)
  {
    (*t).sled = new (node);
    t = (*t).sled; (
    *t).elem = el;
    (*t).sled = NULL;
    cin>>el;
  }
}


//Вывод содержимого однонаправленного линейного списка
//с заглавным звеном
// phead - указатель на заглавное звено списка
void Spisok::VYVOD ()
{
  node *t;
  t = (*phead).sled;
  cout<<"Список: ";
  while (t!=NULL)
  {
    cout<<(*t).elem<<" ";
    t = (*t).sled;
  }
  cout<<endl;
}

//Добавление в начало
//элемента однонаправленного линейного списка
//с заглавным звеном
// phead - указатель на заглавное звено списка
void Spisok::DOBAVLENIE ()
{
  (*phead).sled = Head;
  Head = node;
}

//Удаление из конца
//элемента однонаправленного линейного списка
//с заглавным звеном
// phead - указатель на заглавное звено списка
void Spisok::UDALENIE ()
{
  node* pdel == NULL;
  if (Head == NULL)
  {
    cout<<"список пуст\n";
  }
  if ((*Head).sled == NULL)
  {
    Head = NULL;
    delete Head;
  }
  pdel = Head;
  Head = (*pdel).sled;
  delete pdel;
}

//Проверка на наличие
//элемента однонаправленного линейного списка
//с заглавным звеном
// phead - указатель на заглавное звено списка
void Spisok::PROVERKA ()
{
  phead = NULL;
  int key = -1;
  if (Head == NULL)
  {
    cout<<"список пуст\n";
  }
  cout<<"введите элемент для поиска\n";
  cin>>key;
  phead = Head;
  while (1)
  {
    if (key == (*phead).sled) 
    {
      cout<<"элемент найден\n";
    }
    if ((*phead).sled == NULL)
    {
      cout<<"элемент не найден\n";
    }
    phead = (*phead).sled;
  }
}


//Удаление из памяти однонаправленного линейного списка
//с заглавным звеном
// phead - указатель на заглавное звено списка
void Spisok::OCHISTKA ()
{
  node *q,*q1;// Рабочие указатели
  q = phead;
  q1 = (*q).sled; // Указатель q1 "опережает" указатель q.
  while (q1!=NULL)
  {
    q = q1;
    q1 = (*q1).sled;
    delete q;
  }
};

int main ()
{
  clrscr();

  Spisok A;

  A.POSTROENIE ();
  A.VYVOD ();
  A.DOBAVLENIE ();
  A.UDALENIE ();
  A.PROVERKA ();
  A.OCHISTKA ();

  return 0;
}
Вот программка, которую я с горем по полам написала, с помощью интернета и учебников,
но компилятор почему-то не хочет с этим работать !!
что делать??
подскажите в чем ошибка?? где и как надо исправить??
сдавать лабу нужно в эту пятницу !!
keep it simple
aka_Kiss вне форума Ответить с цитированием
Старый 17.12.2009, 08:01   #5
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
struct node
{
int elem;
node *sled;
} *phead; //Указатель на начало списка
Вы что, структуру внутри класса объявляете? Сделайе ее объявление перед классом, а в самом классе напишите
Код:
node *phead;
И еще, после объявления структуры, ка и после объявления класса, точку с запятой ставьте (у класса вы ее, вроде бы, не забыли.)
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 17.12.2009, 13:15   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение
Вы что, структуру внутри класса объявляете? Сделайе ее объявление перед классом, а в самом классе напишите
Код:
node *phead;
И еще, после объявления структуры, ка и после объявления класса, точку с запятой ставьте (у класса вы ее, вроде бы, не забыли.)
Как ни странно, ошибка как раз не в этом, C++ допускает подобные объявления структур и объектов структур )
2aka_Kiss, этот вариант никуда не годится, очень много ошибок, загадочная переменная Head, которая нигде не объявлена и т.д.
Сама суть верна, но реализация заставляет желать лучшего )
netrino вне форума Ответить с цитированием
Старый 21.12.2009, 01:54   #7
aka_Kiss
Пользователь
 
Аватар для aka_Kiss
 
Регистрация: 23.10.2009
Сообщений: 33
По умолчанию

Так помогите же исправить ошибки !!
Хоть натолкните на них, а лучше ткните пальчиком на то, что нужно исправить и главное КАК !!
Ведь смысл сайта в взаимопомощи)) Так помогите нуждающейся,
может я чему-то и научусь))
keep it simple
aka_Kiss вне форума Ответить с цитированием
Старый 22.12.2009, 00:49   #8
aka_Kiss
Пользователь
 
Аватар для aka_Kiss
 
Регистрация: 23.10.2009
Сообщений: 33
По умолчанию

Человечки, ну помогите добить эту программку, ну пожалуйста !!

Вот это работает, но без классов:
[CPP]#include <stdio.h>
#include <string.h>
#include <stdlib.h>


typedef
struct _node {
int value;
struct
_node * next;
}Node,List;

void CreateList(List * list) {
list->next=NULL;
};

void AddNode(List * list,int value) {
Node * node;
if(list->next==NULL) {
list->next = (Node*) malloc(sizeof( List));
list->next->value=value;
list->next->next=NULL;
return;
};


if(list->next->value >= value) {
node = (Node*)malloc(sizeof( List));
node->value = value;
node->next = list->next;
list->next = node;
} else
AddNode(list->next,value);
};

int DelNode(List * list,int value) {
Node * tmp;
if(list->next==NULL) return 0;
if(list->next->value==value) {
tmp = list->next->next;
free(list->next);
list->next = tmp;
return 1;
} else return DelNode(list->next,value);
};

void PrintList(List * list) {
Node * tmp;
if(list->next == NULL) {
printf("List is empty");
return;
}
tmp = list->next;
while(tmp !=NULL) {
printf("%d ",tmp->value);
tmp=tmp->next;
};
};

int OccList(List * list,int value ) {
if(list->next == NULL) return 0;
if(list->next->value == value)
return 1+OccList(list->next,value);
if(list->next->value >value )
return 0;
return OccList(list->next,value);
};

int main () {
char command[4];
int param1,param2,tmp;
List list;
CreateList(&list);
while(1) {
printf("Enter command : ");
scanf("%s",command);
if(!strcmp(command,"pri") ) {
PrintList(&list);
printf("\n");
};
if(!strcmp(command,"ins") ) {
scanf("%d",&param1);
AddNode(&list,param1);
};
if(!strcmp(command,"del") ) {
scanf("%d",&param1);
if(!DelNode(&list,param1))
printf("There is no given value in the list\n");
};
if(!strcmp(command,"occ") ) {
scanf("%d",&param1);
printf("There are %d entries of %d in list\n",OccList(&list,param1),param 1);
};
if(!strcmp(command,"end") )
break;
};
return 0;
};[/CPP]

А вот я попыталась засунуть все это в классы с конструктором и деструктором,
но что-то не то, там столько ошибок !! [CPP]#include <stdio.h>
#include <string.h>
#include <stdlib.h>

class Spisok
{
public:
typedef
struct _node
{
int value;
struct
_node * next;
} Node,List;


Spisok();
~Spisok();
void AddNode();
int DelNode();
void PrintList();
int OccList();
};

Spisok::Spisok(List *list)
{
list = new (_node);
list->next=NULL;
}

Spisok::~Spisok()
{
delete []list;
}



//Добавление
//элемента однонаправленного линейного списка
void Spisok::AddNode(List * list,int value)
{
Node * node;
if(list->next==NULL)
{
list->next = (Node*) malloc(sizeof( List));
list->next->value=value;
list->next->next=NULL;
return;
};
if(list->next->value >= value)
{
node = (Node*)malloc(sizeof( List));
node->value = value;
node->next = list->next;
list->next = node;
} else
AddNode(list->next,value);
}

//Удаление
//элемента однонаправленного линейного списка
int Spisok::DelNode(List * list,int value)
{
Node * tmp;
if(list->next==NULL)
return 0;
if(list->next->value==value)
{
tmp = list->next->next;
free(list->next);
list->next = tmp;
return 1;
} else
return DelNode(list->next,value);
}

//Печать
//элементов однонаправленного линейного списка
void Spisok::PrintList(List * list)
{
Node * tmp;
if(list->next == NULL)
{
printf("List is empty");
return;
}
tmp = list->next;
while(tmp !=NULL)
{
printf("%d ",tmp->value);
tmp=tmp->next;
}
}

//Проверка на наличие
//элемента однонаправленного линейного списка
int Spisok::OccList(List * list,int value )
{
if(list->next == NULL)
return 0;
if(list->next->value == value)
return 1+OccList(list->next,value);
if(list->next->value >value )
return 0;
return OccList(list->next,value);
}

//главная программа
int main ()
{
//List list;
Spisok A(list);
char command[4];
int param1,param2,tmp;
List list;
CreateList(&list);
while(1)
{
printf("Enter command : ");
scanf("%s",command);
if(!strcmp(command,"pri") )
{
A.PrintList(&list);
printf("\n");
}
if(!strcmp(command,"ins") )
{
scanf("%d",&param1);
A.AddNode(&list,param1);
}
if(!strcmp(command,"del") )
{
scanf("%d",&param1);
if(!A.DelNode(&list,param1))
printf("There is no given value in the list\n");
}
if(!strcmp(command,"occ") )
{
scanf("%d",&param1);
printf("There are %d entries of %d in list\n",A.OccList(&list,param1),par am1);
}
if(!strcmp(command,"end") )
break;
}
return 0;
}[/CPP]

Что там еще доделать и как!! Я сейчас просто с ума сойду с этим кодом!!
Очень жду помощи))
keep it simple
aka_Kiss вне форума Ответить с цитированием
Старый 22.12.2009, 01:39   #9
aka_Kiss
Пользователь
 
Аватар для aka_Kiss
 
Регистрация: 23.10.2009
Сообщений: 33
По умолчанию

Ура !!!
Я его домучала !! Программка заработала !!
Вот она:
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream.h>

class Spisok
{
  private:

typedef
struct _node {
	int value;
	struct
	_node * next;
}Node,List;

  public:
List * list;
Spisok(List * list);
~Spisok();
void AddNode(List * list,int value);
int DelNode(List * list,int value);
void PrintList(List * list);
int OccList(List * list,int value );
};

Spisok::Spisok (List * list)
{
  list = new (_node);
  list->next=NULL;
  cout<<"list is created"<<endl;
}

Spisok::~Spisok()
{
  delete []list;
  cout<<"list is removed"<<endl;
}

void Spisok::AddNode(List * list,int value) {
	Node * node;
	if(list->next==NULL) {
		list->next = (Node*) malloc(sizeof( List));
		list->next->value=value;
		list->next->next=NULL;
		return;
	};


	if(list->next->value >= value)  {
		node = (Node*)malloc(sizeof( List));
		node->value = value;
		node->next = list->next;
		list->next = node;
	} else
		AddNode(list->next,value);
}

int Spisok::DelNode(List * list,int value) {
	Node * tmp;
	if(list->next==NULL) return 0;
	if(list->next->value==value) {
		tmp = list->next->next;
		free(list->next);
		list->next = tmp;
		return 1;
	} else return DelNode(list->next,value);
}

void Spisok::PrintList(List * list) {
	Node * tmp;
	if(list->next == NULL)  {
		printf("List is empty");
		return;
	}
	tmp = list->next;
	while(tmp !=NULL) {
		printf("%d ",tmp->value);
		tmp=tmp->next;
	};
}

int Spisok::OccList(List * list,int value ) {
	if(list->next == NULL) return 0;
	if(list->next->value == value)
		return 1+OccList(list->next,value);
	if(list->next->value >value )
		return 0;
	return OccList(list->next,value);
}

int main () {
	char command[4];
	int param1,param2,tmp;
	List list;
	//CreateList
	Spisok A(&list);
	while(1) {
		printf("Enter command : ");
		scanf("%s",command);
		if(!strcmp(command,"pri") ) {
			A.PrintList(&list);
			printf("\n");
		};
		if(!strcmp(command,"ins") ) {
			scanf("%d",&param1);
			A.AddNode(&list,param1);
		};
		if(!strcmp(command,"del") ) {
			scanf("%d",&param1);
			if(!A.DelNode(&list,param1))
				printf("There is no given value in the list\n");
		};
		if(!strcmp(command,"occ") ) {
			scanf("%d",&param1);
			printf("There are %d entries of %d in list\n",A.OccList(&list,param1),param1);
		};
		if(!strcmp(command,"end") )
			break;
	};
    	return 0;
}
Но !! Когда я набираю команду энд,т.е. выход,
то компилятор выбивает и он исчезает !! Что это такое??
Да и когда список пуст и я набираю при, т.е. печать,
то печатается всякая фигня, весь мусор, который был,
но его же не должно быть??

Как это исправить хоть скажите !!
keep it simple
aka_Kiss вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++. Односвязный список. Уничтожить список Olya90 Помощь студентам 2 10.06.2009 18:52
Односвязный список. Что то сним не так Djaconda Общие вопросы C/C++ 5 01.03.2009 15:46
Линейный односвязный список Absinth Помощь студентам 4 11.11.2008 20:29
Помогите пож-та.Паскаль. Линейный односвязный список (ЛОС) tonich Паскаль, Turbo Pascal, PascalABC.NET 1 25.02.2008 21:55