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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2016, 17:03   #1
ilyakonst
Пользователь
 
Регистрация: 27.03.2016
Сообщений: 20
По умолчанию Линейный список удаление элемента

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

struct comp {
	char name[20];
	int num;
	comp* next; //Ссылка на следущий элемент списка
};
void Add(comp **NewElem, comp **Current)
{
	if ((*NewElem) == NULL)
	{
		*NewElem = (comp*)malloc(sizeof(comp));
		*Current = *NewElem;
		(*Current)->next = NULL;
	}
	else
	{
		 (*NewElem)->next = (comp*)malloc(sizeof(comp));
		*NewElem = (*NewElem)->next;
		(*NewElem) -> next = NULL;
	}
	scanf("%s", (*NewElem)->name);
	scanf("%d", &(*NewElem)->num);
}
void Print(comp *Current)
{
	while (Current != NULL)
	{
		printf("%s\n", Current->name);
		printf("%d\n", Current->num);		
		Current = Current->next;
	}
}
void PrintElem(comp *Current)
{
	printf("%s\n", Current->name);
	printf("%d\n", Current->num);
}
void Search(comp *Current)
{
	char poisk[20];
	scanf("%s", poisk);
	
		if (strcmp(Current->name, poisk)==0)
		{
			PrintElem(Current);
		}
	
}
int main()
{
	comp *Current = NULL;
	comp *End = Current;
	Add(&End, &Current);
	Add(&End, &Current);
	Print(Current);
	Search(Current);
}
Организовал функции добавления элемента, вывода всего списка, вывода конкретного элемента. Никак не получается сделать удаление элемента. Подкиньте идейку пожалуйста
ilyakonst вне форума Ответить с цитированием
Старый 12.04.2016, 17:29   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Можно использовать следующий алгоритм:

если текущий элемент == Current (первый в списке),
то нужно Current присвоить ссылку на следующий элемент
*Current = (*DelElem)->next;

иначе нужно найти элемент, который ссылается на DelElem и в поле next прописать то значение, что прописано в (*DelElem)->next

после этих манипуляций нужно освободить память, занятую DelElem.

всё.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.04.2016, 20:03   #3
ilyakonst
Пользователь
 
Регистрация: 27.03.2016
Сообщений: 20
По умолчанию

Код:
void Del(comp **Current, comp *Prev)
{
	(*Current) == Prev;
	char poisk[20];
	int count=0,i;
	scanf("%s", poisk);
	while (strcmp((*Current)->name, poisk) != 0)
		count++;
	for (i = 0; i < count; i++)
	{
		(*Current) = (*Current)->next;
		Prev == (*Current);
	}
	if (strcmp((*Current)->name, poisk) == 0)
	{
		(*Current) = (*Current)->next;
		}
	Prev->next = (*Current);
	if (strcmp((*Current)->name, poisk) == 0)
		free(Current);
}
получилась вот такая штука, но где-то ошибка. может увидите
ilyakonst вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создать линейный список и проверить наличие в данном списке заданного элемента Делька Помощь студентам 0 02.06.2015 21:19
Двунаправленный список Си. Удаление элемента. n_mitrofanow Помощь студентам 1 05.04.2012 18:18
Линейный список. GripEnemy Visual C++ 0 05.12.2011 22:35
Линейный список doter Общие вопросы C/C++ 1 20.02.2011 21:36
Линейный однонаправленый список. Удаление элемента. 08ekhiv1 Помощь студентам 5 23.03.2010 10:07