#include<stdio.h>
#include<conio.h>
#include<windows.h>
struct node
{
int a;
struct node *next;
};
void createlist(struct node **head)
{
struct node *p,*temp;
int n;
printf("enter the number\n");
scanf("%d",&n);
p=(struct node*)malloc(sizeof(struct node));
p->a=n;
if(*head==0) {
*head=p;
p->next=0;
temp=p;
}
else {
temp->next=p;
temp=p;
p->next=0;
}
}
void frontbacksplit(struct node **head,struct node **head1,struct node **head2)
{
int counter=0,i;
struct node *temp,*p;
temp=*head;
while(temp!=0) {
counter++;
temp=temp->next;
}
int n;
if(counter%2==0) {
n=counter/2;
} else {
n=(counter+1)/2;
}
temp=*head;
for(i=0;i<n-1;i++) {
if(*head1==0) {
*head1=temp;
}
temp=temp->next;
}
p=temp;
temp=temp->next;
p->next=0;
for(i=n+1;i<counter;i++) {
if(*head2==0) {
*head2=temp;
}
temp=temp->next;
}
}
void display(struct node **head)
{
struct node *temp;
temp=*head;
while(temp!=0) {
printf("%d\t",temp->a);
temp=temp->next;
}
printf("\n");
}
int main()
{
int n=1,i,k;
struct node *head3,*head1,*head2;
head3=0;
head1=0;
head2=0;
while(n==1) {
printf("enter \n1-To add the elements\n2-To split the list into front and the back\n3-To display the elements\n");
scanf("%d",&i);
switch(i)
{
case 1:
createlist(&head3);
break;
case 2:
frontbacksplit(&head3,&head1,&head2);
break;
case 3:
printf("enter\n1-To display front list\n2-To display rear list\n");
scanf("%d",&k);
switch(k)
{
case 1:
display(&head1);
break;
case 2:
display(&head2);
}
break;
default:
printf("please enter a valid option\n");
}
printf("enter\n1-To continue\nany other number to exit\n");
scanf("%d",&n);
}
getch();
return 0;
}
Я написал этот код для переднего/заднего разделения связанного списка. Например, если список [1 2 3 4 5], то эта программа разбивает список на два списка: передняя часть (1 2 3) и задняя часть (4 5), если количество элементов равно как части, получаемые равное количество элементов.
Проблема. Когда я пытаюсь добавить элементы в исходный список, первые элементы добавляются как обычно, но когда я пытаюсь добавить другой элемент, моя программа показывает ошибку времени выполнения. Я думаю, что есть проблема с переменной указателя temp, но почти одинаковый код для создания связанного списка работал правильно.
Я использую dev c++ ide на окнах 8.
Конечно, укажите, не нравится ли вам этот вопрос, так как это мой первый раз.
Переменная "temp" указателя в функции createlist() используется без назначения при вызовах, следующих за первым вызовом. Вы можете воспользоваться опциями -Wall, если вы используете GCC.
При первом просмотре эта строка temp->next = p
в функции createlist
неверна, temp
- это локальная переменная, хотя вы указываете на элемент, когда список создается в первый раз, когда значение теряется после createlist
функции createlist
, так что вы будете получать доступ к нежелательным адресам в последовательных вызовах createlist
Может быть, вам следует изменить это:
void createlist(struct node **head)
{
struct node *p,*temp;
int n;
printf("enter the number\n");
while(scanf("%d",&n) != EOF)
{
p=(struct node*)malloc(sizeof(struct node));
p->a=n;
if(*head==0)
{
*head=p;
p->next=0;
temp=p;
}
else
{
temp->next=p;
temp=p;
p->next=0;
}
}
}
temp
после возврата функции ???