这段代码有什么问题://输出链表 void PrintList(LinkList L) { LNode *p; p = L; while (p != nullptr) { cout << p -> data << " "; p = p -> next; } cout << endl; }
时间: 2023-02-08 18:09:01 浏览: 152
这段代码实现了输出链表的功能,但是可能有下列问题:
1. 没有判断链表是否为空,如果链表为空,这段代码会引发空指针异常。
2. 如果链表不是循环链表,没有结束条件,循环可能会无限循环。
需要修改代码来解决以上问题。
相关问题
#include<stdio.h> #include<malloc.h> //申请空间 typedef int ElemType; typedef int Status; typedef struct Lnode { ElemType data; struct Lnode *next; }Lnode, *LinkList; void createList(LinkList L,int n); void print(LinkList L); void release(LinkList L); int main(void) { int n; LinkList L; L=NULL; printf("how many data do you want to input:"); scanf("%d",&n); createList(L,n); print(L); release(L); return 0; } void createList(LinkList L, int n) { L->next = NULL; // 初始化链表为空 int i; for (i = n; i > 0; i--) { Lnode *p = (Lnode*)malloc(sizeof(Lnode)); // 动态申请节点 scanf("%d", &p->data); // 输入节点数据 p->next = L->next; // 将新节点插入链表头部 L->next = p; } } void print(LinkList L) { Lnode *p = L->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } void release(LinkList L) { Lnode *p; while(L!=NULL) { p=L; L=L->next; free(p); }//释放空间时指针所指地址很重要 }找出这段代码的错误
这段代码中的错误在于在 `createList` 函数中,没有分配头节点的内存空间,导致程序会崩溃。正确的代码应该是在 `main` 函数中先分配头节点的内存空间,然后将头节点传入 `createList` 函数中进行链表的创建。修改后的代码如下:
```
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef int Status;
typedef struct Lnode
{
ElemType data;
struct Lnode *next;
}Lnode, *LinkList;
void createList(LinkList L, int n);
void print(LinkList L);
void release(LinkList L);
int main(void)
{
int n;
LinkList L = (Lnode*)malloc(sizeof(Lnode)); // 分配头节点的内存空间
L->next = NULL; // 初始化链表为空
printf("how many data do you want to input:");
scanf("%d", &n);
createList(L, n);
print(L);
release(L);
return 0;
}
void createList(LinkList L, int n)
{
int i;
for (i = n; i > 0; i--)
{
Lnode *p = (Lnode*)malloc(sizeof(Lnode));
scanf("%d", &p->data);
p->next = L->next;
L->next = p;
}
}
void print(LinkList L)
{
Lnode *p = L->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void release(LinkList L)
{
Lnode *p;
while (L != NULL)
{
p = L;
L = L->next;
free(p);
}
}
```
#include<stdio.h> typedef int Elemtype ; typedef struct LNode{ Elemtype data ; struct LNode *next ;}LNode,LinkList ; void CreatList_H(LinkList &L, int n){ L=new LNode ; LinkList P ; L->data=NULL ; L->next=NULL ; int i ; for(i=1;i<=n;i++){ P=new LNode ; scanf("%d",&P->data) ; P->next=L->next ; L->next=P ; } } void ReverseList(LinkList &L,int n){ LinkList P,R ; P=L->next->next ; R=L->next ; int i ; for(i=1;i<n;i++){ R->next=P->next ; P->next=L->next ; L->next=P->next ; P=R->next ; } } void PrintList(LinkList L, int n) { int i ; for(i=1;i<=n;i++){ L=L->next ; printf("%d\n",L->data) ; } } int main{ LinkList L; int n ; scanf("%d",&n); if(n==0) break ; void CreatList(LinkList L,int n) ; void ReverseList(LinkList L,int n); void PrintList(LinkList L, int n) ; return 0 ; }查错
这段代码有一些语法错误和逻辑错误,我帮你指出来:
1. 在主函数的定义中,缺少了括号,应该是 `int main() { ... }`。
2. 在主函数中,调用函数的方式有误。应该是 `CreatList_H(L, n);`,而不是 `void CreatList(LinkList L,int n);` 。
3. 在 `CreatList_H` 函数中,第一次创建头结点时,应该将 `data` 和 `next` 初始化为 `NULL`,而不是 `L->data=NULL ; L->next=NULL ;` 。
4. 在 `ReverseList` 函数中,变量 `R` 的赋值应该在 `P` 的赋值之前,否则会导致链表断裂。
5. 在 `PrintList` 函数中,循环变量 `i` 的初始值应该为 0,不然会导致输出结果缺失第一个节点的数据。
下面是修改过的代码,你可以参考一下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef int Elemtype;
typedef struct LNode {
Elemtype data;
struct LNode *next;
} LNode, *LinkList;
void CreatList_H(LinkList &L, int n) {
L = (LinkList) malloc(sizeof(LNode));
L->data = 0;
L->next = NULL;
LinkList P;
int i;
for (i = 1; i <= n; i++) {
P = (LinkList) malloc(sizeof(LNode));
scanf("%d", &P->data);
P->next = L->next;
L->next = P;
}
}
void ReverseList(LinkList &L, int n) {
LinkList P, R;
R = L->next;
P = R->next;
int i;
for (i = 1; i < n; i++) {
R->next = P->next;
P->next = L->next;
L->next = P;
P = R->next;
}
}
void PrintList(LinkList L, int n) {
int i;
for (i = 0; i < n; i++) {
L = L->next;
printf("%d\n", L->data);
}
}
int main() {
LinkList L;
int n;
while (scanf("%d", &n) != EOF && n != 0) {
CreatList_H(L, n);
ReverseList(L, n);
PrintList(L, n);
}
return 0;
}
```
阅读全文