C++ 为什么这段代码会产生运行时错误? #包括 #包括 #包括 结构节点 { INTA; 结构节点*下一步; }; void createlist(结构节点**头) { 结构节点*p,*temp; int n; printf(“输入数字”); scanf(“%d”和“&n”); p=(结构节点*)malloc(sizeof(结构节点)); p->a=n; 如果(*头==0){ *水头=p; p->next=0; 温度=p; } 否则{ 温度->下一步=p; 温度=p; p->next=0; } } void frontbacksplit(结构节点**head,结构节点**head1,结构节点**head2) { int计数器=0,i; 结构节点*temp,*p; 温度=*水头; while(温度!=0){ 计数器++; 温度=温度->下一步; } int n; 如果(计数器%2==0){ n=计数器/2; }否则{ n=(计数器+1)/2; } 温度=*水头; 对于(i=0;不精确; } p=温度; 温度=温度->下一步; p->next=0; 对于(i=n+1;不精确; } } 无效显示(结构节点**头部) { 结构节点*temp; 温度=*水头; while(温度!=0){ printf(“%d\t”,temp->a); 温度=温度->下一步; } printf(“\n”); } int main() { int n=1,i,k; 结构节点*head3、*head1、*head2; 头3=0; 头1=0; 头2=0; 而(n==1){ printf(“输入\n1添加元素\n2将列表分为前面和后面\n3显示元素”); scanf(“%d”、&i); 开关(一) { 案例1: 创建列表(&head3); 打破 案例2: 前-后裂缝(头3、头1和头2); 打破 案例3: printf(“输入\n1显示前列表\n2显示后列表”); scanf(“%d”和“&k”); 开关(k) { 案例1: 显示器(&head1); 打破 案例2: 显示器(&head2); } 打破 违约: printf(“请输入有效选项\n”); } printf(“输入\n1以继续\n输入其他号码以退出”); scanf(“%d”和“&n”); } getch(); 返回0; }
我已经为链表的前/后拆分编写了此代码。例如,如果列表为[1 2 3 4 5],则此程序将列表拆分为两个列表:前半部分(1 2 3)和后半部分(4 5),如果元素数相等,则两个部分的元素数相等 问题:当我尝试在源列表中添加元素时,第一个元素会像往常一样添加,但当我尝试添加其他元素时,我的程序显示运行时错误。我认为指针变量temp有问题,但创建链接列表的代码几乎相同,但工作正常 我在Windows 8上使用DEVC++ C++ ID. < /P>C++ 为什么这段代码会产生运行时错误? #包括 #包括 #包括 结构节点 { INTA; 结构节点*下一步; }; void createlist(结构节点**头) { 结构节点*p,*temp; int n; printf(“输入数字”); scanf(“%d”和“&n”); p=(结构节点*)malloc(sizeof(结构节点)); p->a=n; 如果(*头==0){ *水头=p; p->next=0; 温度=p; } 否则{ 温度->下一步=p; 温度=p; p->next=0; } } void frontbacksplit(结构节点**head,结构节点**head1,结构节点**head2) { int计数器=0,i; 结构节点*temp,*p; 温度=*水头; while(温度!=0){ 计数器++; 温度=温度->下一步; } int n; 如果(计数器%2==0){ n=计数器/2; }否则{ n=(计数器+1)/2; } 温度=*水头; 对于(i=0;不精确; } p=温度; 温度=温度->下一步; p->next=0; 对于(i=n+1;不精确; } } 无效显示(结构节点**头部) { 结构节点*temp; 温度=*水头; while(温度!=0){ printf(“%d\t”,temp->a); 温度=温度->下一步; } printf(“\n”); } int main() { int n=1,i,k; 结构节点*head3、*head1、*head2; 头3=0; 头1=0; 头2=0; 而(n==1){ printf(“输入\n1添加元素\n2将列表分为前面和后面\n3显示元素”); scanf(“%d”、&i); 开关(一) { 案例1: 创建列表(&head3); 打破 案例2: 前-后裂缝(头3、头1和头2); 打破 案例3: printf(“输入\n1显示前列表\n2显示后列表”); scanf(“%d”和“&k”); 开关(k) { 案例1: 显示器(&head1); 打破 案例2: 显示器(&head2); } 打破 违约: printf(“请输入有效选项\n”); } printf(“输入\n1以继续\n输入其他号码以退出”); scanf(“%d”和“&n”); } getch(); 返回0; },c++,c,C++,C,我已经为链表的前/后拆分编写了此代码。例如,如果列表为[1 2 3 4 5],则此程序将列表拆分为两个列表:前半部分(1 2 3)和后半部分(4 5),如果元素数相等,则两个部分的元素数相等 问题:当我尝试在源列表中添加元素时,第一个元素会像往常一样添加,但当我尝试添加其他元素时,我的程序显示运行时错误。我认为指针变量temp有问题,但创建链接列表的代码几乎相同,但工作正常 我在Windows 8上使用DEVC++ C++ ID. < /P> 当然,如果您不喜欢这个问题的提问方式,请指出,因为这
当然,如果您不喜欢这个问题的提问方式,请指出,因为这是我的第一次。首先查看
createlist
函数中的这一行temp->next=p
是错误的,temp
是一个局部变量,尽管您在第一次创建列表时将其指向元素,但值丢失了呃,createlist
函数返回,因此您将在连续调用createlist
createlist()中的指针变量“temp”时访问垃圾地址函数在第一次调用后的调用中未进行赋值。如果使用GCC,则可以使用-Wall选项。也许您应该更改为:
#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;
}
欢迎使用SO。请使用一个合适的标题来回答您的问题,以便人们一眼就能看出这是怎么回事。一般来说,您可以通过查看本网站的帮助文本来了解如何在此处提问。我想您遇到了seg错误。我认为错误是由于指针泄漏,但无法确定正确的解释。但我编译了几乎相同类型的代码,用于创建带有指针temp的链表,它工作正常。它可以编译,因为在运行时(执行./your_exe)访问您想要的任何地址不是编译错误。如果您访问非法地址,程序将被操作系统终止(通常)…正如@Nabarun所建议的,在运行exectable之前,请查看编译器抛出的警告。您的意思是以前的程序意外运行。我想以前您只创建了一个列表…您打印了吗???我试图编译您的程序,但编译器发出的警告如下:
del.c:22:19:警告:我可能会使用“temp”在此函数中初始化[-Wuninitialized]
你向列表中添加元素是有效的,因为当你只添加元素时,你不会检查列表是否指向它应该指向的位置:所以我的建议是:向列表中添加2个元素,并尝试打印它们,然后继续进行拆分…另一方面…我认为你应该读一本关于C的书…因为显然你缺乏理解我推荐K&R C
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;
}
}
}