Страница 1 из 1

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

Добавлено: 01 май 2010, 18:59
Евгений Александрович
как бы создать функцию, которая бы могла вставить элемент после определённого элемента.
вот мой список:

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

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;
	}
}

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

Добавлено: 01 май 2010, 20:33
Romeo
Пробовал написать такую функцию сам? Что именно не получается?

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

Добавлено: 02 май 2010, 13:46
Евгений Александрович
Старался сделать с объяснениями, но ничего не вышло:

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

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;
}

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

Добавлено: 03 май 2010, 19:48
Romeo
Что сразу бросается в глаза, так это то, что 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;        
    }
}
Я посмотрел только логичность кода. Сам алгоритм не анализировал.