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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2012, 22:39   #1
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию Удаление записей из СВЯЗНОГО СПИСКА

Не могу разобраться с проблемой. Добавление и просмотр работают.
Удаление не совсем корректно.

Хочу чтобы модно было выбрать не только название товара, но и его номер для удаления. А так же чтобы после удаления отображалась обновленная таблица с "правильной нумерацией - 1 2 3 и т.д." и задавался вопрос продолжить удаление или нет. Не могу сообразить как это сделать, подскажите пожалуйста...... Возможно ли это вообще сделать???
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

#define SIZE 40

typedef struct SvSpis   Spis;  

struct SvSpis{
       int    num;
       char   title[SIZE];
       float  price;
       int    sum;
       
       struct SvSpis   *pprev;
       struct SvSpis   *pnext;
       };

void GetStruc(void);
void Review(Spis *p);
void Delete(Spis *p);
void Table(Spis *p);

Spis *begin, *end;	

int main()
{
    char c;
    
while(1)
{
     system("cls");
	 
     puts("\n ******************************************");
	 puts(" *  1 - Создать              *");
	 puts(" *  2 - Просмотреть                  *");
     puts(" *  3 -                  *");
     puts(" *  4 - Удалить                   *");
	 puts(" *  5 -     *");
	 puts(" *  6 -");
	 puts(" *  0 - ÂÛÕÎÄ (ESC)                       *");
	 puts(" ******************************************\n");
	 puts(" Введите число: "); 
     c = getch();
	 
	 switch(c){
		  case '1':  GetStruc();		break;
		  case '2':  Review(begin); 	break;
		  case '3':  					break;
		  case '4':  Delete(begin);			break;
		  case '0': 
	   	  case 27: exit(0);			break;
		  default: {system("cls"); 
		  printf("\n *********************************");
		  printf("\n * Вы ввели неверное значение!!! *");
		  printf("\n *********************************");
		  getch();	}	  }		}
return 0;
}


void GetStruc(void)
{
 	Spis	*p, *tmp = NULL;
	int		n = 1;
 	
	system("cls");
	printf("\n **********************************\n");
	printf(" *  Ввод товаров  *\n");
	printf(" **********************************\n");
	
	do{
	    p = (Spis*)malloc(sizeof(Spis)); 
		p->num = n;
		printf("\n Название товара: ");	
    fflush(stdin);
			fgets(p->title, SIZE, stdin);
		p->title[strlen(p->title)-1] = '\0';
		printf(" Цена: ");		scanf("%g", &p->price);
 	 	printf(" Количество: ");	scanf("%d", &p->sum);
		p->pprev = tmp;
				
		if(tmp != NULL)
			tmp->pnext = p;	
		else
			begin = p;
		tmp = p;
		printf("\n Закончить? (ESC)\n");
		n++;
	}
	while(getch() != 27);
		 
end = p;
end->pnext = NULL;
}


void Review(Spis *p)
{	
	system("cls");
	printf("\n **********************\n");
	printf(" *  Просмотр ТОВАРОВ   *\n");
	printf(" **********************\n");
	Table(p);
getch();	  	           
}

void Delete(Spis *p)
{
 	Spis  	*temp;
	char	tmp[SIZE];
	 
	system("cls");
	printf("\n ****************************\n");
	printf(" *   Удаление товаров из списка   *\n");
	printf(" *****************************\n");
	Table(p);
	printf(" Введите название или № товара: ");
	gets(tmp);
	p = begin;
	while(p != NULL)
	{
	    if(strcmp((p->title), tmp) == 0)
		{
		 	if(p == begin)
			{
			 	 begin = p->pnext;
				 begin->pprev = NULL;
				 free(p);
				 p = begin;  	 
			}
			else if(p == end)
			{
			 	 end = p->pprev;
				 end->pnext = NULL;
				 free(p);
				 p = end; 	 
		    }
			else
			{
			 	 p->pnext->pprev = p->pprev;
			 	 p->pprev->pnext = p->pnext;
			 	 temp = p;
			 	 p = p->pnext;
			 	 free(temp);
	 		}	  
        }
		else
		p = p->pnext;
	}
		 
}

void Table(Spis *p)
{
 	
	printf(" *  №  Название             Цена     Количество *");
	
	while(p != NULL)
	{
 	    printf(" *%3d  %-20s %12.2f %20d *\n", p->num, p->title, p->price, p->sum);
		p = p->pnext;
	}
	
}
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Stilet; 29.10.2012 в 10:58.
Bugrimov вне форума Ответить с цитированием
Старый 29.10.2012, 17:38   #2
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Подскажите пожалуйста! Как можно это реализовать
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание связного списка на Си zx11 Общие вопросы C/C++ 9 17.03.2014 00:54
Удаление повторяющихся элементов двунаправленого связного списка (Си) lowercase Общие вопросы C/C++ 0 13.10.2012 12:09
Заполнение связного однонаправленного списка с++ Chelovekpredel Помощь студентам 1 07.10.2012 16:39
Удаление связного списка из памяти Mahin Общие вопросы C/C++ 3 13.07.2012 10:10
обращениe к члену связного списка soad33 Помощь студентам 0 03.11.2011 22:04