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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2013, 12:01   #1
Alexlive
 
Регистрация: 03.04.2013
Сообщений: 4
По умолчанию Работа с списком

C++//
Здравствуйте, не могу в написать программу, обеспечивающую работу с однонаправленным нециклическим списком, где можно добавлять, удалять(по индексу элемента) и просматривать список. По мимо всего этого нужно реализовать функцию поиска(и если элемент будет найден, нужно вывести его индекс) в списке. После завершения программы вся динамическая память должна быть освобождена, а так же нужно взаимодействие с пользователем организовать в виде простого меню, обеспечивающая возможность переопределения исходных данных и завершение работы программы.

Помогите, пожалуйста. Очень очень нужно...

Заранее спасибо.
Alexlive вне форума Ответить с цитированием
Старый 03.04.2013, 12:19   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Помогите, пожалуйста.
Что Вы уже написали?
Читали ли Вы эту тему, например?
Abstraction вне форума Ответить с цитированием
Старый 03.04.2013, 12:31   #3
Alexlive
 
Регистрация: 03.04.2013
Сообщений: 4
По умолчанию

Цитата:
#include <iostream>

using namespace std;
struct Spisoc{
Spisoc *next;
int info;
} *head, *pnew, *first;

void AddToSpisoc(int &N){
head = new Spisoc;
head->next = NULL;
pnew = head;
for (int j = 0; j<=N; j++){
printf("\n Vvedite info[%d] = ",j);
scanf("%d", &pnew->info);
pnew->next = new Spisoc;
pnew = pnew->next;
pnew->next = NULL;
}
printf("\n Spisok: ");
int j=0;
for (pnew = head; pnew->next != NULL; pnew = pnew->next)
printf("(%d-%d) -> ", j++, pnew->info);
printf("NULL");
}

void AddToElement(int &n,int &N){
printf("\n\nDobavlenie elementa: vvedite znachenie elementa: ");
Spisoc *p = new Spisoc;
scanf("%d",&p->info);

pnew = head;
while ((pnew->info <= p->info) && (pnew->next->info < p->info))
pnew = pnew->next;
printf("%d",pnew->info);
p->next = pnew->next;
pnew->next = p;
printf("\n New spisok one: ");
int j=0;
for (pnew = head; pnew->next != NULL; pnew = pnew->next)
printf("(%d-%d) -> ", j++, pnew->info);
printf("NULL");
}


void DeletetoElement() {
int k;
printf("\n Vvedite nomer elementa, cotorii vi hotite udalit': ");
scanf("%d",&k);
Spisoc *p= head;
head = p->next;
delete p;
p = NULL;
printf("\n New spisok one: ");
int j=0;
for (pnew = head; pnew->next != NULL; pnew = pnew->next)
printf("(%d-%d) -> ", j++, pnew->info);
printf("NULL");
}

void DellToSpisoc(){
while (head->next != NULL){
pnew = head;
head = head->next;
delete [] pnew;
pnew = NULL;
};
delete head;
head = NULL;
};



int main()
{ start:
system("cls");

printf("\nZadanie: \n");
printf("\nVvedite nachalnoe chislo elementov v spiske (N, bez 0-go elementa): ");
int N; int n;
scanf("%d", &N);

AddToSpisoc(N); // çàäàíèå ñïèñêà
char c;
while (c != '4'){// MENU
printf("\n\nHotite dobavit' element? (nagmite 1): ");
printf("\nHotite udalit' element? (nagmite 2): ");
printf("\nHotite naiti element? (nagmite 3)\n");
printf("\nExit? (nagmite 4)\n");
scanf("%c", &c);
scanf("%c", &c);
int n;
if (c=='1') AddToElement(n,N);
if (c=='2') DeletetoElement();
}
DellToSpisoc();

//Ïîâòîð ïðîãðàììû
char cc;
printf("\n\nHotite nachat zanovo (y/n)? ");
scanf("%c", &cc);
scanf("%c", &cc);
if (cc=='y') goto start;
return 0;
}
Трабл с удаление. Происходит удаление из головы, а не по номеру.
Alexlive вне форума Ответить с цитированием
Старый 03.04.2013, 12:38   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Код:
Spisoc *p= head;
head = p->next;
delete p;
Это удаляет первый элемент списка.
Код:
Spisok *p = cur;
cur->next = cur->next->next;
delete cur->next;
Это удаляет элемент cur->next.
Код:
Spisok *cur = head;
for(int i=1; i<k; ++i) cur = cur->next;
Это устанавливает элемент cur на (k-1)-ый элемент списка (без проверки длины), если k>=1.

Этот код:
Код:
printf("\n New spisok one: ");
int j=0;
for (pnew = head; pnew->next != NULL; pnew = pnew->next)
printf("(%d-%d) -> ", j++, pnew->info);
printf("NULL");
настоятельно советую вынести в отдельную функцию.
Abstraction вне форума Ответить с цитированием
Старый 03.04.2013, 12:48   #5
Alexlive
 
Регистрация: 03.04.2013
Сообщений: 4
По умолчанию

Я всё таки не понял, как мне сделать, что бы удаление происходило по номеру элемента, который вводится с клавиатуры?
Alexlive вне форума Ответить с цитированием
Старый 03.04.2013, 13:04   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Так, как у Вас (имейте в виду, что лучше бы функция удаления принимала индекс и указатель на голову списка в качестве аргументов) - запросить номер, если он 0 - удалить первый элемент; если он больше 0 - установить указатель cur на (k-1)-ый элемент и удалить cur->next.
Abstraction вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа со списком, си tim47 Помощь студентам 0 25.03.2012 16:58
Работа со списком soirkar Visual C++ 12 20.07.2011 21:09
работа с списком soirkar Visual C++ 0 28.06.2011 16:29