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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2009, 21:38   #1
Anvilion
 
Регистрация: 17.01.2009
Сообщений: 7
По умолчанию Сравнение списков в С

Здраствуйте. Кому не лень, помогите пожалуйста.
Задача: Создать 2 списка, и сравнить общие элементы, если есть вывести на экран. (язык С)
Как содавать 2 списка я понял, но функцию сравнения общих элементов списка не получилось создать
Если не сложно, то покажите как сделать ту же функцию рекурсивно.
Заранее спасибо =)
Anvilion вне форума Ответить с цитированием
Старый 24.06.2009, 22:24   #2
StudentPolitech
Форумчанин
 
Аватар для StudentPolitech
 
Регистрация: 21.11.2008
Сообщений: 400
По умолчанию

Код:
#include <iostream.h>
#include <conio.h>
 
struct element		//создание структуры
{
int key;
element *next;
};

element *make_element();		// прототипы функций
element *make_list(int n);
element *add(element *l1, element *l2);
void print(element *beg);

int main()		// главная функция
{
clrscr();
int n,m;		// объявление переменных
element *l1,*l2,*l;
cout<<"Vvedite kol-vo elementov v spiske 1"<<endl;
cin>>n;
cout<<"Vvedite kol-vo elementov v spiske 2"<<endl;
cin>>m;
cout<<"VVedite elementy spiska 1:"<<endl;
l1=make_list(n);
cout<<"Vvedite elementy spiska 2:"<<endl;
l2=make_list(m);
l=add(l1,l2);
clrscr();
cout<<"Spisok 1"<<endl;
print(l1);
cout<<"Spisok 2"<<endl;
print(l2);
cout<<"Itogoviy spisok"<<endl;
print(l);
getch();
return 0;
}
							// описание функций
element *make_element()		// функция создания элемента списка
{
element *p=new (element);
cout<<"Vvedite element: ";
cin>>p->key;
p->next=0;
return p;
}

element *make_list(int n)	// функция создания списка
{
element *beg=make_element();
element *r;
for(int i=1;i<n;i++)
	{
   r=make_element();
   r->next=beg;
   beg=r;
   }
return beg;
}

element *add(element *l1, element *l2)	// функция поиска и добавления 
{							// искомых элементов
element *beg,*r,*q,*z, *k;
int n=0, i=0;
k=l1;
while(k)
	{
   z=l2;
   while(z)
   	{
      if((k->key)==(z->key)) i=1;
          z=z->next;
         }
    if(!i) {
               if (n)
             	     {
                     r=new (element);
                     r->key=k->key;
                     r->next=0;
                     q->next=r;
                     q=r;
                     }
             else
                     {
                     beg=new (element);
                     beg->key=k->key;
                     beg->next=0;
	             q=beg;
                     n=1;
                     }
            }
            i=0;
        k=k->next;
   }
return beg;
}
void print(element *p)		// функция вывода на экран списка
{
if(!p){cout<<"spisok pust"<<endl;}
while(p)
	{
   cout<<p->key<<"  ";
   p=p->next;
   }
cout<<endl;
}
Прога добавлять в список L элементы, которые есть в списке l1, но нет в списке l2, переделать не сложно разберись с этой
Винда, KIS 2010, книжка по С/С++, остальное неважно........
StudentPolitech вне форума Ответить с цитированием
Старый 24.06.2009, 22:49   #3
Anvilion
 
Регистрация: 17.01.2009
Сообщений: 7
По умолчанию

Ну вот я пробывал сделать сам что-то...но походу компиляции понял что оно просто сравнивает списки на равность (т.е все элементы должны совпадать) а мне нужно просто чтоб общие элементы выводило
Извиняюсь за отсутствие отступлений, скопировалось чето так
СРАВНЕНИЕ СПИСКОВ
Код:
#define mem_alloc (pnode)malloc(sizeof(tnode))
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
typedef struct node_t
{
int info;
struct node_t *next;
}
tnode, *pnode;
void Prt(pnode top)
{
if(top)
{
printf("%d", top->info);
Prt(top->next);
}
}
pnode Form()
{
pnode cur;
int x;
scanf("%d", &x);
if(x==0)
return NULL;
cur=mem_alloc;
cur->info=x;
cur->next=Form();
return cur;
}
void Proverka(pnode top1,pnode top2)
{
pnode cur1=top1;
pnode cur2=top2;
while(cur1&&cur2)
{
if(((cur1->next)&&(!cur2->next)||((!cur1->next)&&(cur2->next))))
{
puts("aren't similar");
break;
}
if(cur1->info!=cur2->info)
{
puts("aren't similar");
break;
}
if(cur1->info==cur2->info)
{
puts("are similar");
break;
}
cur1=cur1->next;
cur2=cur2->next;
}
}
void main()
{
pnode top1;
pnode top2;
printf("Enter elements of 1 list\n");
top1=Form();
printf("Enter elements of 2 list\n");
top2=Form();
puts("First list:");
Prt(top1);
puts(" ");
puts("Second list:");
Prt(top2);
puts(" ");
Proverka(top1,top2);
}
РЕКУРСИВНОЕ СРАВНЕНИЕ СПИСКОВ
Код:
#define mem_alloc (pnode)malloc(sizeof(tnode))
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
typedef struct node_t
{
int info;
struct node_t *next;
}
tnode, *pnode;
void Prt(pnode top)
{
if(top)
{
printf("%d", top->info);
Prt(top->next);
}
}
pnode Form()
{
pnode cur;
int x;
scanf("%d", &x);
if(x==0)
return NULL;
cur=mem_alloc;
cur->info=x;
cur->next=Form();
return cur;
}
int Proverka(pnode cur1, pnode cur2)
{
if(cur1&&cur2)
{
if(((cur1->next)&&(!cur2->next)||((!cur1->next)&&(cur2->next))))
return 0;
if(cur1->info!=cur2->info)
return 0;
return Proverka(cur1->next, cur2->next);
}
return 1;
}
void main()
{
int x;
pnode top1;
pnode top2;
printf("Enter elements of 1 list\n");
top1=Form();
printf("Enter elements of 2 list\n");
top2=Form();
puts("First list:");
Prt(top1);
puts(" ");
puts("Second list:");
Prt(top2);
puts(" ");
x=Proverka(top1,top2);
puts("0-aren't similar;1-are similar");
printf("%d\n",x);
}
Anvilion вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Формирование списков BrenD Microsoft Office Excel 1 06.04.2009 08:28
слияние списков counter Общие вопросы C/C++ 4 02.01.2009 22:47
Сравнение двух списков lelik759 Microsoft Office Excel 7 13.04.2008 22:19
Объединение списков. life_burns Microsoft Office Excel 5 05.04.2008 16:13