Member 12749899 Ответов: 2

Моя программа выходит из строя, когда начинается второй цикл, есть идеи, что с ней может быть не так?


#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main() {
typedef struct element {
	int val;
	struct element * next;
}list;
list * addEl(list * l, int x){
	list * tmp;
	tmp=malloc(sizeof(list));
	tmp->val=x;
	tmp->next=1;
	l=tmp;
}

	list *l; int n; int x,i; l=NULL;
	printf("Add the number of elements to add\n");
	scanf("%d",&n);
	printf("Enter the elements\n");
	for(i=0;i<n;i++){
		scanf("%d",&x);
		l=addEl(l,x);
	}
	for(i=0;i<n;i++){
		printf("%d\n",l->val);
		l=l->next;
	}
	
	return 0;
}

[no name]

Просто сбросив свой код в публикацию на форуме, вы не зададите вопрос.

Patrice T

"возникли проблемы" не информативно.
укажите, в чем проблема и где.

Member 12749899

программа выходит из строя, когда она начинает второй цикл for, который печатает элементы связанного списка

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

2 Ответов

Рейтинг:
6

Patrice T

Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.

Настоящий кодекс:

list * addEl(list * l, int x){
	list * tmp;
	tmp=malloc(sizeof(list));
	tmp->val=x;
	tmp->next=1;
	l=tmp;
}

это просто неправильно, tmp->next=1; вы набрали "1" (один) вместо " l " (нижний регистр L).
и ты забыл кое-что вернуть.


Member 12749899

Господи, как же я сейчас глупо себя чувствую, спасибо!

Рейтинг:
2

Richard MacCutchan

То addEl функция должна возвращать list *- но вы ничего не возвращаете. И в этой функции настройка l=tmp; устанавливает только локальный параметр l, а не оригинальный указатель. Вам также необходимо переместить определение структуры и addEl функции за пределами main.


Member 12749899

Я взял код из одного из своих школьных учебников и подумал, что могу попробовать, чтобы лучше понять его, и добавил второй цикл for, чтобы увидеть, как он работает, поэтому я думаю, что проблема в том, где я внес изменения...