单循环链表头插法遍历完直接退出来是怎么回事呀?
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#define BOOL int
#define FALSE 0
#define TRUE 1
typedef struct link{
int data;
struct link* next;
}LinkList;
BOOL InitList(LinkList* L); //初始化
void List_HeadInsert(LinkList* L);//头插法
void List_TailInsert(LinkList* L);//尾插法,正序输入
void display(struct link* p);
int main()
{
LinkList L; LinkList P;
List_TailInsert(&L);
List_HeadInsert(&P);
printf("BYE");
return 0;
}
BOOL InitList(LinkList* L)
{
L = (LinkList*)malloc(sizeof(LinkList));
if (L == NULL)
{
printf("内存不足");
return FALSE;
}
L->next = L;
return TRUE;
}
void List_HeadInsert(LinkList* L)
{
InitList(L);
int x;
LinkList* temp = L;
printf("请输入数据:");
scanf("%d", &x);
while (x != 0)
{
LinkList* a = (LinkList*)malloc(sizeof(LinkList));
a->data = x;
a->next = temp->next;
temp->next = a;
printf("请再次输入(输入0结束插入):");
scanf("%d", &x);
}
display(L);
}
void List_TailInsert(LinkList* L)
{
InitList(L);
int x;
LinkList* temp = L;
printf("请输入数据:");
scanf("%d", &x);
while (x != 0)
{
LinkList* a = (LinkList*)malloc(sizeof(LinkList));
a->data = x;
temp->next = a;
temp = a;
printf("请再次输入(输入0结束插入):");
scanf("%d", &x);
}
temp->next = L;
display(L);
}
void display(struct link* p)
{
struct link* t = p->next; //凭借电视头指针,p->next指向第一个元素的地址
while (t != p) //链表的最后一个结点是NULL,遇到NULL就会结束
{
printf("%d ", t->data); //遍历数据区
t = t->next; //指向下一个结构的地址
}
printf("\n");
}```
修改如下,改动处见注释,供参考:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#define BOOL int
#define FALSE 0
#define TRUE 1
typedef struct link {
int data;
struct link* next;
}LinkList;
BOOL InitList(LinkList* L); //初始化
void List_HeadInsert(LinkList* L);//头插法
void List_TailInsert(LinkList* L);//尾插法,正序输入
void display(struct link* p);
int main()
{
LinkList L;
L.next = &L; // 修改
LinkList P;
P.next = &P; // 修改
List_TailInsert(&L);
List_HeadInsert(&P);
printf("BYE");
return 0;
}
BOOL InitList(LinkList* L)
{
L = (LinkList*)malloc(sizeof(LinkList));
if (L == NULL)
{
printf("内存不足");
return FALSE;
}
L->next = L;
return TRUE;
}
void List_HeadInsert(LinkList* L)
{
//InitList(L); // 修改
int x;
LinkList* temp = L;
printf("请输入数据:");
scanf("%d", &x);
while (x != 0)
{
LinkList* a = (LinkList*)malloc(sizeof(LinkList));
a->data = x;
a->next = temp->next;
temp->next = a;
printf("请再次输入(输入0结束插入):");
scanf("%d", &x);
}
display(L);
}
void List_TailInsert(LinkList* L)
{
//InitList(L); // 修改
int x;
LinkList* temp = L;
printf("请输入数据:");
scanf("%d", &x);
while (x != 0)
{
LinkList* a = (LinkList*)malloc(sizeof(LinkList));
a->data = x;
temp->next = a;
temp = a;
printf("请再次输入(输入0结束插入):");
scanf("%d", &x);
}
temp->next = L;
display(L);
}
void display(struct link* p)
{
struct link* t = p->next; //凭借电视头指针,p->next指向第一个元素的地址
while (t != p) //链表的最后一个结点是NULL,遇到NULL就会结束
{
printf("%d ", t->data); //遍历数据区
t = t->next; //指向下一个结构的地址
}
printf("\n");
}
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
【以下回答由 GPT 生成】
问题原因是在List_HeadInsert
函数中,没有设置循环终止条件,导致无限循环,最终程序崩溃或直接退出。
具体解决方案如下:
List_HeadInsert
函数的while循环中,添加循环终止条件,例如当输入数据为0时,退出循环。while (x != 0)
{
// ...
printf("请再次输入(输入0结束插入):");
scanf("%d", &x);
}
在插入数据时,先判断是否为0,如果是0则退出循环。
List_HeadInsert
函数的参数为指针的指针,并在函数内部对指针进行操作。void List_HeadInsert(LinkList** L)
{
InitList(*L);
int x;
LinkList* temp = *L;
printf("请输入数据:");
scanf("%d", &x);
while (x != 0)
{
LinkList* a = (LinkList*)malloc(sizeof(LinkList));
a->data = x;
a->next = temp->next;
temp->next = a;
printf("请再次输入(输入0结束插入):");
scanf("%d", &x);
}
}
这样更新链表的操作可以直接修改传入的指针,避免传参时修改不成功的问题。
main
函数中将List_HeadInsert
函数调用中的参数修改为&P
。int main()
{
LinkList L; LinkList P;
List_TailInsert(&L);
List_HeadInsert(&P);
printf("BYE");
return 0;
}
这样才能正确传入链表的指针地址。
经过以上修改,程序可以正常运行。
【相关推荐】