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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2009, 23:27   #1
PriN_ce
Новичок
Джуниор
 
Регистрация: 11.11.2009
Сообщений: 2
По умолчанию Си

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

Что-то вроде 2связного списка я написал (если это еще то):
Код:
#include <stdio.h>


struct add {
	char* a;
    struct add *p_adr, *p_next, *p_pred;
};


void main() {
    struct add *p,*pl=0,*p_pr=0;
    int i=0;
	for (;i<5;i++) {
		p = malloc(sizeof(struct add));
		p->a = (char*)malloc(sizeof(char));
		scanf("%s",p->a);
		p->p_adr=pl;
		p->p_next=p;
		p->p_pred=p_pr;
		p_pr=pl;
		pl=p;
		
        
	}

	for(p=pl;p!=0; p=p->p_adr){ 
		printf("p->a=%s\np->p_next=%.08X\np->p_adr=%.08X\np->p_pred=%.08X\n\n", p->a,p->p_next,p->p_adr,p->p_pred);
	}


	getch();
}
Т.е. объясните, я правильно понимаю, 2 связный список - это структура, где один из элементов хранит адрес предыдущей структуры, а другой следующей структуры?

Дальше я не очень понимаю, что от меня хотят в задани:
обеспечить обработку всех элементов списка, заранее неизвестной функцией, зная только её прототип.(применить указатель на функцию)
Что такое указатель на ф-ию и прототип я знаю, но что мне конкретно надо написать? что за обработка? удаление? вставка?
PriN_ce вне форума Ответить с цитированием
Старый 03.12.2009, 23:48   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
обеспечить обработку всех элементов списка, заранее неизвестной функцией, зная только её прототип.(применить указатель на функцию)
То, что должна делать эта функция, должны решить вы сами. От вас требуется лишь вызвать ее по указателю...
Это полезно при вызове некоторой функции из динамической библиотеки (dll).
counter вне форума Ответить с цитированием
Старый 04.12.2009, 16:52   #3
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Цитата:
Сообщение от PriN_ce Посмотреть сообщение
Дальше я не очень понимаю, что от меня хотят в задани:
обеспечить обработку всех элементов списка, заранее неизвестной функцией, зная только её прототип.(применить указатель на функцию)
Что такое указатель на ф-ию и прототип я знаю, но что мне конкретно надо написать? что за обработка? удаление? вставка?
Обычно под обработкой элементов понимают добавление (как вариант добавление добавление до/после заданного элемента), удаление, поиск элемента. Особое внимание стоит обратить на добавление первого элемента в список и удаление последнего.
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 11.12.2009, 22:38   #4
PriN_ce
Новичок
Джуниор
 
Регистрация: 11.11.2009
Сообщений: 2
По умолчанию

counter,nazavrik спасибо, вроде разобрался)
Вобщем может комунить пригодится:

Код:
#include <stdio.h>
#include <string.h>


struct add {
	char* a;
    struct add *p_adr, *p_next, *p_pred;
};
void Add();void Pokaz();void Delete();
void Change( char (*uk)(char *, const char *) );
int k;


struct add *p,*pl=0,*p2;
void main() {
    int ch;
	char (*uk)(char *, const char *);
	uk=strcat;

    for(;;) {  
	  printf("##################################Contact_list##################################\n\n");
	    printf("1 - Add \n");
		printf("2 - Delete \n");
		printf("3 - Pokazat \n");
		printf("4 - Change\n");
		printf("5 - Exit \n");
        scanf("%i",&ch);
		

		if (ch==1) Add();
		if (ch==2) Delete();
	    if (ch==3) Pokaz();
		if (ch==4) Change(uk);
		if (ch==5) exit(0);
  }
	

}

void Add() {
    
	printf("Vvedite slovo: \n");
	k+=1;
	if (k==1) p = malloc(sizeof(struct add));
	p2 = malloc(sizeof(struct add));
		p->a = (char*)malloc(sizeof(char));
		scanf("%s",p->a); 
		p->p_adr=p; 
		p->p_next=pl;
		p->p_pred=p2;
		pl=p;
		p=p2;		
}
		

void Pokaz() {
    struct add *t;
	printf("\nSpisok:\n");
	for(t=pl;t!=0; t=t->p_next) 
		printf("p->a=%s\np->p_next=%.08X\np->p_adr=%.08X\np->p_pred=%.08X\n\n", t->a,t->p_next,t->p_adr,t->p_pred);
}

void Delete() {
	char* s=(char*)malloc(sizeof(char));
	struct add *vn, *vp, *po, *t;
	k--;
	
	puts("Vvedite slovo kotoroe hotite zadeletit\n");
	scanf("%s",s);
	if (k==0) {puts(" Eto poslednii element");  pl=0;}
	else {
	for(t=pl;t!=0; t=t->p_next) {
		if (strcmp(t->a,s)==0 &&  t->p_next==0) {
			t=t->p_pred;

			t->p_next=NULL;
			break;
		
		}
		
		if (strcmp(t->a,s)==0 && t->p_adr==pl ) {
			vp=t->p_pred;
			vn=t->p_next;

            t=vn;
			t->p_pred=vp;

            pl=vn;
		}
			
		if (strcmp(t->a,s)==0 && t->p_next!=0 && t->p_adr!=pl) {
            po=t;

			vp=t->p_pred;
			vn=t->p_next;

			t=vp;
			t->p_next=vn;
			
			t=vn;
			t->p_pred=vp;

			t=po;
					
		}
		    
	
	}
	}

	
}


void Change( char (*uk)(char *, const char *) ) {
	struct add *t;
	int i=0;
	char* s = (char*)malloc(sizeof(char));
	puts("Pribavlyaem: ");
	gets(s);
	for(t=pl;t!=0; t=t->p_next){
		(*uk)(t->a,s);
}
}
Функция, к-я должна обработать все эл-ты структур, как сказано в задании, я сделал Change(), она просто тупо прилепляет ко всем эл-там строку заданную пользователем)
PriN_ce вне форума Ответить с цитированием
Ответ


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