Вставить элемент после определённого элемента.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

как бы создать функцию, которая бы могла вставить элемент после определённого элемента.
вот мой список:

Код: Выделить всё

struct list{
char c;
list *next;
}*p,*cur,*prev,*top;

void show(void);
void push(char value);
void pop(char value);

int main()
{
	top=0;
	char key,value;
	int done=false;
	while(!done){
		system("cls");
		show();
		printf("\nA)dd\nD)elete\nQ)uit\n");
		key=getchar();
		switch(toupper(key))
		{
		case 'A':
	value=getch();
	push(value);
	break;
		case 'D':
			printf("\nDel:\n");
			value=getch();
			pop(value);
			break;
		case 'Q':
			done=true;
			break;
		}
	}
	return 0;
}
void push(char value)
{
	printf("\nInput:\n");
	p=new list;
	p->c=value;
	p->next=NULL;
	while(cur && p->c > cur->c)
	{
	prev=cur;
	cur=cur->next;
	}
	if(prev==NULL)
	{
	p->next=top;
	top=p;
	}
	else
	{
	p->next=cur;
	prev->next=p;
	}
}
void pop(char value)
{
	prev=top;cur=top->next;
	if(value==top->c)
	{
	p=top;
	top=top->next;
	free (p);
	}
	else
	{
	while(cur!=NULL && value!=cur->c)
	{
	prev=cur;
	cur=cur->next;
	}
	if(cur!=0)
	{
	p=cur;
	prev->next=cur->next;
	free (p);
	}
         }
}
void show()
{
	p=top;
	if(p==0)
	printf("\n list is empty\n");
	else
	printf("\nLIST:\n");
	while(p)
	{
	printf("%c\n",p->c);
	p=p->next;
	}
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Пробовал написать такую функцию сам? Что именно не получается?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

Старался сделать с объяснениями, но ничего не вышло:

Код: Выделить всё

void add(char value)
{
	p=new list;
	if(p==NULL) { printf("Error");getch();exit(1);}
	p->c=value;
	p->next=NULL;
	top=prev;
	for(int i=0;top!=NULL;i++)
	{
		if(i==value)
		{
			p->next=top->next;
		}
		top->next=p; break;
	}
	top=top->next;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Что сразу бросается в глаза, так это то, что break поставлен снаружи if, таким образом цикл for будет выполняться только один раз при любых исходным значениях. Подозреваю, что более правильным будет следующая разбивка кода по блокам:

Код: Выделить всё

void add(char value)
{
    p=new list;
    if(p==NULL) { printf("Error");getch();exit(1);}
    p->c=value;
    p->next=NULL;
    top=prev;
    for(int i=0;top!=NULL;i++)
    {
        if(i==value)
        {
            p->next=top->next;
            top->next=p;
            break;
        }
        top=top->next;        
    }
}
Я посмотрел только логичность кода. Сам алгоритм не анализировал.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить