可以帮我指出我在学头插法尾插法遇到的这些错误的改正方法吗 谢谢
这是运行后出现的问题:
以下是代码部分:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode {
ElemType data; //数据域
struct LNode* next; //指针域
}LNode, * LinkList;
//头插法 带头结点
LinkList HeadInsert(LinkList L, int n) {
LNode* s;
int x = 1;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
while (x != n) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
x++;
}
return L;
}
//尾插法 带尾节点
LinkList TailInsert(LinkList L, int n) {
int x = 1;
L = (LinkList)malloc(sizeof(LNode));
L->data = x++;
LNode* s, * r = L;
while(x != n) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
L->next = s;
r = s;
x++;
}
r->next = NULL;
return L;
}
// 便利链表、头结点
void PrintList(LinkList L) {
LNode* s;
s = L->next;
while (s != NULL) {
printf("%d\t", s->data);
s = s->next;
}
}
//便利链表
void Print(LinkList L) {
LNode* s;
s = L;
while (s != NULL) {
printf("%d\t", s->data);
s = s->next;
}
}
int main() {
LinkList L, S;
printf("有头结点的头插法:");
HeadInsert(L, 10);
PrintList(L);
printf("有尾结点的尾插法:");
TailInsert(S, 10);
PrintList(S);
}
在调用头插法和尾插法时,没有传入链表的头结点指针。应该将函数调用改为HeadInsert(&L, 10)和TailInsert(&S, 10)。
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode {
ElemType data; //数据域
struct LNode* next; //指针域
} LNode, * LinkList;
//头插法 带头结点
LinkList HeadInsert(LinkList* L, int n) {
LNode* s;
int x = 1;
*L = (LinkList)malloc(sizeof(LNode));
(*L)->data = 0;
(*L)->next = NULL;
while (x != n) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = (*L)->next;
(*L)->next = s;
x++;
}
return *L;
}
//尾插法 带尾节点
LinkList TailInsert(LinkList* L, int n) {
int x = 1;
*L = (LinkList)malloc(sizeof(LNode));
(*L)->data = x;
LNode* s, * r = *L;
while (x != n) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
x++;
}
r->next = NULL;
return *L;
}
// 遍历链表、头结点
void PrintList(LinkList L) {
LNode* s;
s = L->next;
while (s != NULL) {
printf("%d\t", s->data);
s = s->next;
}
printf("\n");
}
int main() {
LinkList L, S;
printf("有头结点的头插法:");
HeadInsert(&L, 10);
PrintList(L);
printf("有尾结点的尾插法:");
TailInsert(&S, 10);
PrintList(S);
return 0;
}
【以下回答由 GPT 生成】
代码中存在以下错误:
HeadInsert
函数中,创建头结点时应该使用L = (LinkList)malloc(sizeof(LNode));
,而不是将L
指向NULL
,这样才能正确创建一个带有头结点的链表。同时,在插入新结点时,应该先将新结点指向头结点的下一个结点,再将头结点指向新结点,这样才能正确进行头插法操作。修改后的代码如下:LinkList HeadInsert(LinkList L, int n) {
LNode* s;
int x = 1;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
while (x != n) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
x++;
}
return L;
}
TailInsert
函数中,创建链表头结点后,应该初始化x
为2
,因为链表的第一个数据结点已经在头结点中初始化。在插入新结点时,应该先将新结点插入到尾结点r
的后面,再更新r
指针指向新的尾结点。同时,在插入新结点时,应该将新结点的next
指针指向NULL
,表示链表的末尾。修改后的代码如下:LinkList TailInsert(LinkList L, int n) {
int x = 2;
L = (LinkList)malloc(sizeof(LNode));
L->data = 1;
LNode* s, * r = L;
while(x != n) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
x++;
}
r->next = NULL;
return L;
}
PrintList
和Print
遍历链表的方式不正确,遍历链表时应该从头结点的下一个结点开始,而不是头结点本身。修改后的代码如下://遍历链表、头结点
void PrintList(LinkList L) {
LNode* s;
s = L->next;
while (s != NULL) {
printf("%d\t", s->data);
s = s->next;
}
}
//遍历链表
void Print(LinkList L) {
LNode* s;
s = L;
while (s != NULL) {
printf("%d\t", s->data);
s = s->next;
}
}
修改后的完整代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode {
ElemType data; //数据域
struct LNode* next; //指针域
}LNode, * LinkList;
//头插法 带头结点
LinkList HeadInsert(LinkList L, int n) {
LNode* s;
int x = 1;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
while (x != n) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
x++;
}
return L;
}
//尾插法 带尾节点
LinkList TailInsert(LinkList L, int n) {
int x = 2;
L = (LinkList)malloc(sizeof(LNode));
L->data = 1;
LNode* s, * r = L;
while(x != n) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
x++;
}
r->next = NULL;
return L;
}
//遍历链表、头结点
void PrintList(LinkList L) {
LNode* s;
s = L->next;
while (s != NULL) {
printf("%d\t", s->data);
s = s->next;
}
}
//遍历链表
void Print(LinkList L) {
LNode* s;
s = L;
while (s != NULL) {
printf("%d\t", s->data);
s = s->next;
}
}
int main() {
LinkList L, S;
printf("可以帮我指出我在学头插法尾插法遇到的这些错误的改正方法吗 谢谢\n\n");
printf("以下是代码部分:\n\n");
//...
}
希望这些修改能够解决你遇到的问题,如果还有其他问题,请随时提出。
【相关推荐】