#include<stdio.h>
#include<malloc.h>
#include<Windows.h>
#include<malloc.h>
typedef struct node
{
int data;
struct node *next;
}Node,*Pnode;
Pnode creat_list();
void show_list(Pnode phead);
BOOL is_empty(Pnode phead);
//BOOL insert_list();
//BOOL delete_list();
int length_list(Pnode phead);
int main()
{
Pnode phead = NULL; //创建头指针
phead = creat_list(); //此时将头指针指向了头结点 所以头指针就相当于变为了头结点
show_list(phead);
}
Pnode creat_list()
{
int len = 0;
int val = 0;
printf(“请输入想要的链表长度为:”,len);
scanf_s("%d", &len);
Pnode p = (Pnode)malloc(sizeof(Node)); //创建头结点
/*Pnode Tail = p;*/
p->data = NULL;
p->next = NULL;
for (int i = 1; i <=len; i++)
{
Pnode a = (Pnode)malloc(sizeof(Node)); //创建一个新的节点
printf("第%d个节点为:", i);
scanf_s("%d", &val);
a->data = val;
p->next = a;
a->next = NULL;
p = a;
}
return p;
}
BOOL is_empty(Pnode p)
{
if (p == NULL) //判断首节点是否为空
return TRUE;
else
return FALSE;
}
int length_list(Pnode phead)
{
int len = 0;
Pnode p = phead->next; //定义一个p节点指向首节点
while (p != NULL)
{
len++;
p = p->next;
}
return len;
}
void show_list(Pnode phead)
{
int i;
int len = length_list(phead);
Pnode p = phead->next; //p指向了首结点
if (is_empty§)
{
printf(“该链表为空,无法输出”);
return FALSE;
}
while(p!=NULL)
{
printf("%d", p->data);
p = p->next;
}
return;
}
此图为上面代码的实行结果,我反复检查了一个小时,一次一次的试错中,感觉怎么检查都没错的时候,我开始确定是最开始创建链表的时候,是不是当时创建链表就出现了问题,于是我开始检查起链表的循环输入时,for循环的最后,我将p指向a,此时就代表将头结点的p重新又将其指向了尾结点,这样一来输出的肯定是空啊,这时候我就想,头结点肯定是不能动的,所以必须再设置一个节点(作为头结点的分身,其指向的改变不会影响到头结点的指向)。于是:
我试着设置了一个尾结点作为头结点的分身,其一开始就当做头结点使用,一开始先指向一个新节点,然后在新节点指向空时,再让尾结点指向新节点,这样一来,当循环时,Tail节点就能一直作为尾结点使用。
注意头结点不要随意改动,可以再定义一个节点作为其分身,效果与头结点一样,只是不能通过尾结点而改变头结点