none
Не могу "связать" список RRS feed

  • Вопрос

  • Язык программирования: C

    Среда разработки: Visual Stuio 2012 Express

    Хочу составить "базу данных", которая бы хранила номер и имя владельца этого номера. При этом хочу чтобы "база данных" была реализована при помощи "списка", который создал. Но программа ничего не даёт необходимого результата: она не выводит на экран имя и номер. Подскажите пожалуйста в чём проблема? Заранее спасибо.

    Дополнение 1. Почему-то now не начинает ссылаться на новый "объект", то есть не изменяется адрес now.

    Ниже представлен код на C:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    struct man
    {
    	int number;
    	char name[31];
    	struct man *next;
    };
    
    
    void addToList(int number, const char name[], struct man *now);
    void printList(struct man *now);
    
    main(void)
    {
    	struct man *now;
    	now = NULL;
    	addToList(10, "Tom", now);
    	addToList(20, "Mike", now);
    	printList(now);
    }
    
    void addToList(int number, const char name[], struct man *now)
    {
    	struct man *p;
    	p = (struct man *)malloc(sizeof(struct man));
    	p->number = number;
    	strcpy(p->name, name);
    	p->next = now;
    	now = p;
    }
    
    void printList(struct man *now)
    {
    	while (now != NULL) {
    		printf("Name: %s\nNumber: %d\n", now->name, now->number);
    		now = now->next;
    	}
    }



    • Изменено iTiPo 10 января 2014 г. 15:37
    10 января 2014 г. 14:40

Ответы

  • Верно. В первом случае функция получала копию указателя и изменение этой копии не отражалось на значении самого указателя. Во втором случае функция получает адрес переменной-указателя и Вы изменяете его значение.
    • Помечено в качестве ответа iTiPo 11 января 2014 г. 13:34
    11 января 2014 г. 13:21
  • Проблема решена. Новое решение находится ниже.

    Исправление: в параметрах addToList переменная now сменила тип с struct man *now на struct man **now 

    А также изменилась "передача" man в addToList: addToList(10, "Tom", &now);

    Остался один вопрос: я добавил & так как я хочу изменить указатель now, верно?

    Новый код:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    struct man
    {
    	int number;
    	char name[31];
    	struct man *next;
    };
    
    
    void addToList(int number, const char name[], struct man **now);
    void printList(struct man *now);
    
    main(void)
    {
    	struct man *now;
    	now = NULL;
    	addToList(10, "Tom", &now);
    	addToList(20, "Mike", &now);
    	printList(now);
    }
    
    void addToList(int number, const char name[], struct man **now)
    {
    	struct man *p;
    	p = (struct man *)malloc(sizeof(struct man));
    	p->number = number;
    	strcpy(p->name, name);
    	p->next = *now;
    	*now = p;
    }
    
    void printList(struct man *now)
    {
    	while (now != NULL) {
    		printf("Name: %s\nNumber: %d\n ===\n", now->name, now->number);
    		now = now->next;
    	}
    }


    • Изменено iTiPo 11 января 2014 г. 6:55
    • Помечено в качестве ответа iTiPo 11 января 2014 г. 13:35
    10 января 2014 г. 19:47

Все ответы

  • Проблема решена. Новое решение находится ниже.

    Исправление: в параметрах addToList переменная now сменила тип с struct man *now на struct man **now 

    А также изменилась "передача" man в addToList: addToList(10, "Tom", &now);

    Остался один вопрос: я добавил & так как я хочу изменить указатель now, верно?

    Новый код:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    struct man
    {
    	int number;
    	char name[31];
    	struct man *next;
    };
    
    
    void addToList(int number, const char name[], struct man **now);
    void printList(struct man *now);
    
    main(void)
    {
    	struct man *now;
    	now = NULL;
    	addToList(10, "Tom", &now);
    	addToList(20, "Mike", &now);
    	printList(now);
    }
    
    void addToList(int number, const char name[], struct man **now)
    {
    	struct man *p;
    	p = (struct man *)malloc(sizeof(struct man));
    	p->number = number;
    	strcpy(p->name, name);
    	p->next = *now;
    	*now = p;
    }
    
    void printList(struct man *now)
    {
    	while (now != NULL) {
    		printf("Name: %s\nNumber: %d\n ===\n", now->name, now->number);
    		now = now->next;
    	}
    }


    • Изменено iTiPo 11 января 2014 г. 6:55
    • Помечено в качестве ответа iTiPo 11 января 2014 г. 13:35
    10 января 2014 г. 19:47
  • Верно. В первом случае функция получала копию указателя и изменение этой копии не отражалось на значении самого указателя. Во втором случае функция получает адрес переменной-указателя и Вы изменяете его значение.
    • Помечено в качестве ответа iTiPo 11 января 2014 г. 13:34
    11 января 2014 г. 13:21