#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存在问题,但创建链表的代码几乎相同。
我在Windows 8上使用dev c ++ ide。
当然,如果你不喜欢问这个问题的方式,请注意,因为这是我的第一次。
答案 0 :(得分:0)
首先看temp->next = p
函数中的这一行createlist
是错误的,temp
是一个局部变量,尽管你在第一次创建列表时指向该元素createlist
函数返回后,该值将丢失,因此您将在连续调用createlist
答案 1 :(得分:0)
在第一次调用之后的调用中,正在使用createlist()函数中的指针变量'temp'而不分配。如果您使用的是GCC,则可以使用-Wall选项。
答案 2 :(得分:-1)
也许你应该改为:
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;
}
}
}