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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2017, 11:57   #1
Александр Волков
Новичок
Джуниор
 
Регистрация: 20.05.2017
Сообщений: 1
Вопрос Структуры данных Си

Когда список работает со списком list то все проходит хорошо, но когда я начинаю добавлять в список ListM то происходит ошибка в функции: struct ListM * addelemM(ListM *lst, int number, int id, char text[], char data[]). Хотя код добавления идентичный функции struct list * addelem(list *lst, double val).


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

typedef struct list
{
  double val; // поле данных
  struct list *next; // указатель на следующий элемент
  struct list *prev; // указатель на предыдущий элемент
}list;

typedef struct ListM
{
  int  number; // поля данных
	int id;
	char text[30];
	char data[30];
  struct ListM *next; // указатель на следующий элемент
  struct ListM *prev; // указатель на предыдущий элемент
}ListM;

struct list * CreateList(double a) {
	struct list *lst;
	 lst = (struct list*)malloc(sizeof(struct list));
	lst->next = NULL;
	lst->prev = NULL;
	lst->val = a;
	return lst;
}

struct ListM * CreateListMessage(int  number, int id, char text[], char data[]) {
	struct ListM *lst;
	 lst = (struct ListM*)malloc(sizeof(struct ListM));
	lst->next = NULL;
	lst->prev = NULL;
	lst->number = number;
	lst->id = id;
	strcpy(lst->text, text);
	strcpy(lst->data, data);
	return lst;
}

struct list * addelem(list *lst, double val)
{
  struct list *temp, *p;
  temp = (struct list*)malloc(sizeof(list));
  p = lst->next; // сохранение указателя на следующий узел
  lst->next = temp; // предыдущий узел указывает на создаваемый
  temp->val = val; // сохранение поля данных добавляемого узла
  temp->next = p; // созданный узел указывает на следующий узел
  temp->prev = lst; // созданный узел указывает на предыдущий узел
  if (p != NULL)
    p->prev = temp;
  return(temp);
}

struct ListM * addelemM(ListM *lst, int  number, int id, char text[], char data[])
{
  struct ListM *temp, *p;
  temp = (struct ListM*)malloc(sizeof( ListM));
  p = lst->next; // сохранение указателя на следующий узел <<<<<<<<<<<<<<<<<< ОШИБКА ТУТ 
	lst->next = temp; // предыдущий узел указывает на создаваемый

temp ->number = number;
temp->id = id;
strcpy(temp->text, text);
strcpy(temp->data, data);
  temp->next = p; // созданный узел указывает на следующий узел
  temp->prev = lst; // созданный узел указывает на предыдущий узел

  if (p != NULL)
    p->prev = temp;

  return(temp);
}

struct list * deletelem(list *lst)
{
  struct list *prev, *next;
  prev = lst->prev; // узел, предшествующий lst
  next = lst->next; // узел, следующий за lst
  if (prev != NULL)
    prev->next = lst->next; // переставляем указатель
  if (next != NULL)
    next->prev = lst->prev; // переставляем указатель
  free(lst); // освобождаем память удаляемого элемента
  return(prev);
}

void printList(list *lst)
{
  struct list *p;
  p = lst;
  do {
    printf("%lf ", p->val); // вывод значения элемента p
    p = p->next; // переход к следующему узлу
  } while (p != NULL); // условие окончания обхода
}

void printListM(ListM *lst)
{
  struct ListM *p;
  p = lst;
  do {
    printf("Номер сообщения: %d. ID: %d. Текст сообщения: %s. Дата отправления: %s \n", p->number, p->id, p->text, p->data); // вывод значения элемента p
    p = p->next; // переход к следующему узлу
  } while (p != NULL); // условие окончания обхода
}

struct list * delAllList(list *root)
{
	if(root->next == NULL && root->prev == NULL){
		printf("\nСписок пуст!\n");
		return 0;
	}
  struct list *temp;
  temp = root->next;
  temp->prev = NULL;
  free(root);   // освобождение памяти текущего корня
printf("\nСписок очищен!\n");
  return(temp); // новый корень списка
}



double val;
char bufVal[30] = { 0 }, ch;
int nomer;
int id;
char text[30] = { 0 };
char daTa[30] = { 0 };

int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "Ru");

	list *head, *cur;
	ListM *Head, *Curr;
	double num = 1.5;
	head = CreateList(num);
	cur = head;

	while (1) {
		printf( "Введите данные типа double: ");
		 gets(bufVal);
		if (bufVal[0] == '\0')
			break;
		else {
			val = atof(bufVal);
			cur = addelem(cur, val);			
		}
	}
	printList(head);
	delAllList(head);

	printf("\n\n");
	Head = CreateListMessage(123, 96325874, "Hello!", "12.11.1997 15:12");
	Curr = addelemM(Curr, 789, 85214736, "My Bro!", "28.05.2017 11:05");
	printListM(Head);
 
    return 0;
}

Последний раз редактировалось Александр Волков; 20.05.2017 в 12:04.
Александр Волков вне форума Ответить с цитированием
Старый 20.05.2017, 12:13   #2
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 734
По умолчанию

Цитата:
Сообщение от Александр Волков Посмотреть сообщение
Код:
typedef struct list
{
  double val; // поле данных
  struct list *next; // указатель на следующий элемент
  struct list *prev; // указатель на предыдущий элемент
} list;
- зачем Вы называете структуру и тип одним и тем же именем, наверное это не очень хорошо.

Цитата:
Сообщение от Александр Волков Посмотреть сообщение
Код:
struct ListM * addelemM(ListM *lst, int  number, int id, char text[], char data[])
{
  struct ListM *temp, *p;
  temp = (struct ListM*)malloc(sizeof( ListM));
- зачем здесь везде слово struct писать. Это генерирует ошибку или нет? В любом случае здесь оно не нужно. Я уже сталкивался с чем-то таким подобным и это слово разрешалось писать. Здесь именно этот случай?

Цитата:
Сообщение от Александр Волков Посмотреть сообщение
Код:
p = lst->next; // сохранение указателя на следующий узел <<<<<<<<<<<<<<<<<< ОШИБКА ТУТ
- а какая ошибка-то, скопируйте сюда строку ошибки из компилятора, пожалуйста.

Т.е. мне нужно номер ошибки, строка и описание ошибки.

Цитата:
Сообщение от Александр Волков Посмотреть сообщение
Код:
p = lst->next; // сохранение указателя на следующий узел <<<<<<<<<<<<<<<<<< ОШИБКА ТУТ
- я так понимаю, что в этом месте lst будет последний узел в цепочке, если это так тогда lst->next будет =NULL. А если это так тогда зачем его присваивать p?

Цитата:
Сообщение от Александр Волков Посмотреть сообщение
Код:
Curr = addelemM(Curr, 789, 85214736, "My Bro!", "28.05.2017 11:05");
- вот здесь не голову Head нужно случайно передавать первым параметром?
Вы запутались и усложнили себе программу. Распутайтесь и упростите программу. Начинайте работать от головы и не крутите себе лишнего.
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.

Последний раз редактировалось BDA; 20.05.2017 в 13:23.
Cuprum5 вне форума Ответить с цитированием
Старый 20.05.2017, 13:21   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Во-первых, Cuprum5, ну не нужно устраивать из форума чат. Пишите все мысли в одно сообщение. Во-вторых, Александр, раз делаете по аналогии с list, то полностью все шаги повторяйте: потеряли Curr = Head после создания списка.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 25.05.2017, 15:21   #4
invd
Новичок
Джуниор
 
Регистрация: 25.05.2017
Сообщений: 1
По умолчанию

Стоит написать небольшой сет функций управления списком, который можно было бы в дальнейшем использовать с любой структурой данных (см. пример во вложении).
Вложения
Тип файла: txt que.c.txt (13.4 Кб, 133 просмотров)
invd вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Структуры данных на С. art1es23 Общие вопросы C/C++ 3 05.11.2015 14:42
Динамические структуры данных, списковые структуры (надо разобраться что делает программа) _4Alex4_ Помощь студентам 1 14.11.2012 07:39
Структуры данных alex-soft Паскаль, Turbo Pascal, PascalABC.NET 0 17.01.2012 19:10
Структуры данных SlayerLiving C++ Builder 2 07.03.2011 20:26
Структуры данных LeNus'Ka Помощь студентам 4 23.11.2010 17:43