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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2009, 22:13   #1
Dieno
Новичок
Джуниор
 
Регистрация: 16.10.2009
Сообщений: 2
По умолчанию [C] Односвязный список

Доброго времени суток. Помогите пожалуйста в работе над односвязным линейным списком. Вот есть код того, что уже наработано:
Код:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
 
struct List
{
	int num;
	List *next;
};
 
void printmenu(){
	printf("\nChoose action number: ");
	printf("\n1. Input");
	printf("\n2. Add beefor last");
	printf("\n3. Association two list");
	printf("\n4. Turn the lust");
	printf("\n5. Show all");
	printf("\n6. Exit\n");
}

List *Add(List *root)
{   
    List *tmp=new List;
	List *p;
	printf("\nSome incoming data...\n");
	printf("Enter number ");
	scanf("%d",&(tmp->num));
	tmp->next=NULL;
	if(root==NULL)
	{
		return tmp;
 }
	else
	{
		p=root;
		while(p->next!=NULL)
		{
			p=p->next;
		}
		p->next=tmp;
		return root;
	}
}

void ShowAll(List *root)
{
     
	while(root)
	{
		printf("%d ;  ",root->num);
		root=root->next;
	}
}

List* Reverse(List* root)
{
    if(root==0)
        return 0;
    if(root->next==0)
        return root;
    List *rv = Reverse(root->next);
    root->next->next = root;
    root->next = 0;
    return rv;
}

int main()
{
    List *root=NULL,*tmp;
    char ch[10];
    int k;
    while(1)
	{
		printmenu();
        scanf("%s",ch);
        k=atoi(ch);           
                       switch(k){
                                    case 1:
                                       {     
                                         system("cls");
                                         int a,b = 0;
                                         printf("\nHow much element do you want add? ");
                 	                     scanf("%d",&a);
                                         while(b < a)
                                           {  
                                                root = Add(root); b++; 
                                           } 
                                         printf("All number added. Press any key to continue");
                                         getch();
                                         system("cls");
                                         break;
                                       };  
                                    case 2:
                                    case 3:
                                    case 4: 
                                         root = Reverse(root); 
                                         printf("List turned. Press any key to continue"); 
                                         getch(); 
                                         system("cls");
                                         break;
                                    case 5: 
                                         system("cls"); 
                                         ShowAll(root); 
                                         printf("\n"); 
                                         break;     
                                    case 6: 
                                         exit(0);
                                    default: 
                                         printf("\nIncorrect input. Press any key to continue\n");
                                         getch(); 
                                         system("cls");                           
                                }
     }
     while(tmp=root){
                     root=root->next;
                     delete tmp;
                    }                                
     return 0;
}
Не получается добавить в него функцию добавления заданного количества элементов перед последним. Т.е. если заранее известно что добавлять надо именно перед последним элементом.
Был вариант вот такой
Код:
void AddBefore(List* root, List *p, List *c)
{
     List *tmp;
     tmp=root;
     printf("%d",p->num);
     while(tmp && tmp->next != p) tmp = tmp->next;
     if (tmp) 
     {     
           c->next = tmp->next;
           tmp->next = c;
     } 
}
где в p было значение последнего элемента, а в с значения тех элементов, которые надо добавить, но так не получилось.
Dieno вне форума Ответить с цитированием
Старый 17.10.2009, 22:26   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

попробуй так

Код:
void AddBefore(List* root, List *p, List *c)
{
   List *tmp=root;
 
   while(tmp->next!=p) tmp=tmp->next;

   tmp->next=c;

   while(tmp->next) tmp=tmp->next;
 
   tmp->next=p;
}
counter вне форума Ответить с цитированием
Старый 19.10.2009, 18:52   #3
Dieno
Новичок
Джуниор
 
Регистрация: 16.10.2009
Сообщений: 2
По умолчанию

Спасибо большое. Такой метод подошёл
Dieno вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Односвязный список crusarder Помощь студентам 1 23.10.2009 17:56
C++. Односвязный список. Уничтожить список Olya90 Помощь студентам 2 10.06.2009 18:52
Односвязный список. С++ Ozza Помощь студентам 1 06.02.2009 02:09
Линейный односвязный список Absinth Помощь студентам 4 11.11.2008 20:29
C: односвязный список в файле getfear Помощь студентам 7 04.01.2008 19:26