Двухсвязный список в Си

Тема в разделе "C/C++/C#", создана пользователем Pront0, 3 дек 2009.

  1. Pront0

    Pront0 Гость

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

    Что-то вроде 2связного списка я написал (если это еще то):
    Код (C++):
    #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 связный список - это структура, где один из элементов хранит адрес предыдущей структуры, а другой следующей структуры?

    Дальше я не очень понимаю, что от меня хотят в задани:
    обеспечить обработку всех элементов списка, заранее неизвестной функцией, зная только её прототип.(применить указатель на функцию)
    Что такое указатель на ф-ию и прототип я знаю, но что мне конкретно надо написать? что за обработка? удаление? вставка?
     
  2. Pront0

    Pront0 Гость

    Сам спросил сам сделал, вобщем мжет кому нить пригодится:

    Код (Text):
    #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(), она просто тупо прилепляет ко всем эл-там строку заданную пользователем)
     
Загрузка...
Похожие Темы - Двухсвязный список Си
  1. gx6060
    Ответов:
    2
    Просмотров:
    435
  2. gx6060
    Ответов:
    6
    Просмотров:
    577
  3. Shandrik
    Ответов:
    6
    Просмотров:
    813
  4. anna
    Ответов:
    8
    Просмотров:
    816
  5. erhe
    Ответов:
    10
    Просмотров:
    792

Поделиться этой страницей