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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2009, 01:22   #1
levandowskiy
Пользователь
 
Регистрация: 18.08.2009
Сообщений: 32
По умолчанию Как заполнить связный список?

Доброго времени суток, уважаемые форумчане)

Начал изучать С++, дошёл до связных списков и вот тут встала проблема... Я не понимаю как его заполнить , вернее код я написал... программа запускается , но увы после ввода выдаёт ошибку:

Unhandled exception at 0x004114b9 in 1 Change.exe: 0xC0000005: Access violation writing location 0x00000000.

ума не приложу из-за чего это происходит...

Вот сам код:

Код:
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <cstddef>
using namespace std;

struct INT
{
	int num;
	INT *link;
};

typedef INT* intptr;

void input (intptr& link, int n);

int _tmain(int argc, _TCHAR* argv[])
{
	char ans;
	int n;
	do
	{
		cout<<"Input how many numbers in list: ";
		cin>>n;

		intptr list, head;
		list = new INT[n];

		for (int i=0; i<n; i++)
		{
			cout<<"Input number #"<<i+1<<" : ";
			cin>>list[i].num;
			if (i==0)
			{
				head->num = list[i].num;
			}
			else if (i==1)
			{
				list[i-1].link = head->link;
				list[i-1].link->num = list[i].num;
			}
			else if (i>=2)
			{
				list[i-1].link = list[i-2].link->link;
				list[i-1].link->num = list[i].num; //показывает что ошибка в этой строке
			}

			list[n-1].link = NULL;
		}

			for (int i=0; i<n; i++)
			{
				cout<<"Number #"<<i+1<<" = ";
				if (i==0)
					cout<<head->num<<endl;
				else
					cout<<list[i-1].link->num<<endl;
			}
			cout<<endl;
		

		delete [] list;
		cout<<"continue:  ";
		cin>>ans;
	} while (ans=='Y'||ans=='y');
	return 0;
}

Надеюсь на вашу помощь А именно хочу узнать что за ошибка и что я написал не так((

Последний раз редактировалось Sazary; 18.08.2009 в 15:21.
levandowskiy вне форума Ответить с цитированием
Старый 18.08.2009, 09:00   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Код:
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <cstddef>
using namespace std;

struct INT
{
	int num;
	INT *link;
};

typedef INT* intptr;

void input (intptr& link, int n); // Где эта функция собственно реализована?

int _tmain(int argc, _TCHAR* argv[])
{
	char ans;
	int n;
	do
	{
		cout<<"Input how many numbers in list: ";
		cin>>n;

		intptr list, head;
		list = new INT[n];

		for (int i=0; i<n; i++)
		{
			cout<<"Input number #"<<i+1<<" : ";
			cin>>list[i].num;
			if (i==0)
			{
				head->num = list[i].num; // head - указатель на "мусор"
				// а вы по этому адресу пытаетесь что-то записать
				// правильно будет так:
				head = list[i];
				// хотя что вообще это делает в цикле?
				// перед циклом напишите head = list[0] и ввод значения
			}
			/*else if (i==1)
			{
				list[i-1].link = head->link;
				list[i-1].link->num = list[i].num;
			}*/
			else /*if (i>=2)*/
			{
				list[i-1].link = list[i/*-2*/]/*.link->link*/;
				// Эта строчка и не нужна
				//list[i-1].link->num = list[i].num; //показывает что ошибка в этой строке
			}

			list[n-1].link = NULL; // что это делает в цикле?
		}
			// Неправильный перебор списка
			/*for (int i=0; i<n; i++)
			{
				cout<<"Number #"<<i+1<<" = ";
				if (i==0)
					cout<<head->num<<endl;
				else
					cout<<list[i-1].link->num<<endl;
			}*/
			
			for (int i =1, intptr p = head;
			  p != NULL;
			  ++i, p = p->link)
			{
				cout << "Number #" << i <<" = "
					<< p->num << endl;
			}
			cout<<endl;
		

		delete [] list;
		cout<<"continue:  ";
		cin>>ans;
	} while (ans=='Y'||ans=='y');
	return 0;
}
Как-то вот так, если я ничего тут не напутал. Хотя заполнение списка тоже необычное и не совсем корректное, ибо сводит к заполнению массива. Массива тут вообще быть не должно.
Если уж работаете со списком, то нужно кроме головы хранить хвост (последний элемент), чтобы вставка быстрее происходила (иначе каждый раз нужно будет искать хвост, чтобы к нему "прицепить" новый элемент).
Код:
intptr head = NULL, last = NULL;
...
for (...)
{
  intptr current = new INT; // выделение памяти под новый элемент списка
  current->link = NULL; // это будет последний элемент, а потому ссылку обнуляем
  // Ввод числа в current->num
  ...
  // Добавление в список
  if (!head) // если список пуст
  {
    head = current; // текущий элемент записываем как голову списка
    last = head; // и как хвост
  }
  else
  {
    last->link = current; // к последнему элементу списка "прицепляем" новый
    last = current; // и уже его запоминаем как последний
  }
}
Ну очистку списка сами, надеюсь, напишите
ЗЫ. Пользуйтесь тэгом code
pu4koff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заполнить StringGrid???? Anna_new Помощь студентам 15 19.04.2008 00:34
Как автоматом заполнить поле? Stanislav PHP 4 09.03.2008 01:57
ComboBox как заполнить из БД scrazy БД в Delphi 2 28.05.2007 14:49
как заполнить Canvas рисунком? vicvtor Общие вопросы Delphi 5 17.11.2006 14:21