网上代码以直接写在main()函数中实现创建居多,对于初学者如何实现在函数中creatList是一个问题,在学习过程中我将此实现,希望能帮助到同我一般的迷途的人,节约时间。具体代码如下,:(完整代码在最后)
由于VS中无法使用scanf函数,本代码使用第一行来解决。
#define _CRT_SECURE_NO_WARNINGS 1
printlist函数是输出函数,将LinkList传入后,首先将跳过头指针将指针跳到首个data数据输出,可以使用while重复,知道L->next ==null,值得注意的是当L->next==null,最后一个并没有输出,对此可以使用do-while来代替while,本文使用while结束再次输出L->data来解决该问题。
void printfList(LinkList L)
{
L = L->next;
while (L->next != NULL)
{
printf("%d",L->data);
L = L->next;
}
printf("%d",L->data);
}
c语言中可以通过指针来更改内容,但是本次代码我的困难是不知道如何将更改后值传回,故我使用了return,将新的Lreturn回主函数,在main函数中对L再次赋值,从容达到更改L内容的目的,假如有更好的方法欢迎大家指正。
LinkList creatListByhead(LinkList L,int n)
{
LNode* s;
int x;
//建立头结点
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
//下来赋值
for (int i = 0;i < n;i++)
{
scanf("%d",&x);
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
}
return L;
}
其中,第二个参数是指链表中元素个数(除去头指针),我这里设置为5,故scanf输入5个数字后执行printf,为了让能看清,我没有在printf中换行。
L =creatListByhead(L, 5);
下面是完整的代码,大家可以直接复制到VS中直接运行
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
//头插法创建单链表
LinkList creatListByhead(LinkList L,int n)
{
LNode* s;
int x;
//建立头结点
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
//下来赋值
for (int i = 0;i < n;i++)
{
scanf("%d",&x);
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
}
return L;
}
void printfList(LinkList L)
{
L = L->next;
while (L->next != NULL)
{
printf("%d",L->data);
L = L->next;
}
printf("%d",L->data);
}
int main()
{
LinkList L=NULL;
L =creatListByhead(L, 5);
printfList(L);
return 0;
}