大神,这段小代码运行结束后总是崩溃,该如何该呢?多谢
请教各位大神,这段小代码运行结束后总是崩溃,该怎么该呢?谢谢
#include<stdio.h>
#include<stdlib.h>
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
Status InitList_L(LinkList L); //初始话链表,返回头指针Head
LinkList CreatList_L(LinkList L, int n); //逆位序输入n个元素的值,建立带头结点的单链表L
void PrintLinkList_L(LinkList L); //输出链表
Status InitList_L(LinkList L)
{
L = (LinkList)malloc(sizeof(LNode));
if (L == NULL)
{
exit(ERROR);
}
L->next = NULL;
printf("初始化成功!\n");
return OK;
}
LinkList CreatList_L(LinkList L, int n)
{
int i = 0;
LNode *p = NULL;
printf("请依次输入%d个数据:\n", n);
for (i = n; i > 0; i --)
{
p = (LinkList)malloc(sizeof(LNode));
scanf("%d", &p->data);
p->next = L->next;
L->next = p;
}
printf("输入完成!\n");
}
void PrintLinkList_L(LinkList L)
{
LinkList p = L->next;
while (p != NULL)
{
printf("%4d", p->data);
p = p->next;
}
printf("\n");
}
Status main(void)
{
int n;
LNode L;
InitList_L(&L);
printf("请输入要输入数据的个数:");
scanf("%d", &n);
CreatList_L(&L, n);
PrintLinkList_L(&L);
return 0;
}
------解决方案--------------------
问题在于InitList_L这里有问题.
InitList_L的参数是LinkList.但函数的行为却是把参数当做LinkList*用.
要么把 InitList_L 里的分配动作去掉改成直接初始化对象.
要么把 LNode L;这里改成LinkList L; InitList_L参数改成LinkList*.
你现在的代码,初始化是无用的.因为你只是初始化了函数内分配的对象.但这个对象在后面使用的过程中被丢弃了.而main里的LNode L还是未初始化状态.所以最后PrintLinkList_L的时候访问了非法的内容.
最简单的改法:
Status InitList_L(LinkList L)
{
L->next = NULL;
printf("初始化成功!\n");
return OK;
}
------解决方案--------------------
#include<stdio.h>
#include<stdlib.h>
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
Status InitList_L(LinkList L); //初始话链表,返回头指针Head
LinkList CreatList_L(LinkList L, int n); //逆位序输入n个元素的值,建立带头结点的单链表L
void PrintLinkList_L(LinkList L); //输出链表
Status InitList_L(LinkList L)
{
L = (LinkList)malloc(sizeof(LNode));
if (L == NULL)
{
exit(ERROR);
}
L->next = NULL;
printf("初始化成功!\n");
return OK;
}
LinkList CreatList_L(LinkList L, int n)
{
int i = 0;
LNode *p = NULL;
printf("请依次输入%d个数据:\n", n);
for (i = n; i > 0; i --)
{
p = (LinkList)malloc(sizeof(LNode));
scanf("%d", &p->data);
p->next = L->next;
L->next = p;
}
printf("输入完成!\n");
}
void PrintLinkList_L(LinkList L)
{
LinkList p = L->next;
while (p != NULL)
{
printf("%4d", p->data);
p = p->next;
}
printf("\n");
}
Status main(void)
{
int n;
LNode L;
InitList_L(&L);
printf("请输入要输入数据的个数:");
scanf("%d", &n);
CreatList_L(&L, n);
PrintLinkList_L(&L);
return 0;
}
------解决方案--------------------
问题在于InitList_L这里有问题.
InitList_L的参数是LinkList.但函数的行为却是把参数当做LinkList*用.
要么把 InitList_L 里的分配动作去掉改成直接初始化对象.
要么把 LNode L;这里改成LinkList L; InitList_L参数改成LinkList*.
你现在的代码,初始化是无用的.因为你只是初始化了函数内分配的对象.但这个对象在后面使用的过程中被丢弃了.而main里的LNode L还是未初始化状态.所以最后PrintLinkList_L的时候访问了非法的内容.
最简单的改法:
Status InitList_L(LinkList L)
{
L->next = NULL;
printf("初始化成功!\n");
return OK;
}
------解决方案--------------------
- C/C++ code
Status InitList_L(LinkList L) { /*L = (LinkList*)malloc(sizeof(LNode)); if (L == NULL) { exit(ERROR); }*/ L->next = NULL; printf("初始化成功!\n"); return OK; } LinkList CreatList_L(LinkList L, int n) { int i = 0; LNode *p = NULL; printf("请依次输入%d个数据:\n", n); for (i = n; i > 0; i --) { p = (LinkList)malloc(sizeof(LNode)); scanf("%d", &p->data); p->next = L->next; L->next = p; } printf("输入完成!\n"); return L; } void PrintLinkList_L(LinkList L) { LinkList p = L->next; while (p != NULL) { printf("%4d", p->data); p = p->next; } printf("\n"); } Status main(void) { int n; LNode L; InitList_L(&L); printf("请输入要输入数据的个数:"); scanf("%d", &n); CreatList_L(&L, n); PrintLinkList_L(&L); return 0; }