#include<stdio.h>
#include<stdlib.h>
typedef struct num{
int num;
struct num *next;
}Num, *NUM;
//创建链表
NUM createlist(NUM L,int x)
{
printf("开始创建链表\n");
NUM head,r,s,tail;
int i=0;
head=(NUM)malloc(sizeof(Num)); //初始化head节点,为空表头开辟一个内存空间
while(i<x)
{
s=(Num *)malloc(sizeof(Num));
// printf("请输入数字\n");
scanf("%d",&s->num);
if(i==0)
{
head->next=s;
}
else
{
r->next=s;
}
r=s;
i++;
}
tail=(NUM)malloc(sizeof(Num));
tail->next=NULL;
r->next=tail;
printf("\n创建链表成功!\n");
return head;
}
void getlist(NUM L)
{
printf("\n开始输出\n");
//传入的是空表头,只是储存了下一个节点的地址,需要让它指向真正的头节点
L=L->next;
while(L->next !=NULL)
{
printf("%d ",L->num);
L=L->next;
}
printf("\n输出完毕\n");
}
void main()
{
NUM r,s;
// NUM *head=&r;
/*这里其实可以用指针的方法去创建一个链表,
在创建链表的子函数中return就可以执行其他功能了 */
int x,y;
printf("请输入想要创建的链表数\n");
scanf("%d",&x);
s=createlist(r,x);
getlist(s);
}
用指针的方法创建带有空表头的链表
#include<stdio.h>
#include<stdlib.h>
typedef struct num{
int num;
struct num *next;
}Num, *NUM;
//创建链表
NUM createlist(NUM *L,int x)
{
printf("开始创建链表\n");
NUM r,s,tail;
int i=0;
*L=(NUM)malloc(sizeof(Num));
(*L)->next=NULL;
while(i<x)
{
s=(Num *)malloc(sizeof(Num));
// printf("请输入数字\n");
scanf("%d",&s->num);
if(i==0)
{
(*L)->next=head;
}
else
{
r->next=s;
}
r=s;
i++;
}
tail=(NUM)malloc(sizeof(Num));
tail->next=NULL;
r->next=tail;
printf("\n创建链表成功!\n");
// return head;
}
void getlist(NUM L)
{
printf("\n开始输出\n");
// if(L==NULL)
L=L->next;
while(L->next !=NULL)
{
printf("%d ",L->num);
L=L->next;
}
printf("\n输出完毕\n");
}
void main()
{
NUM r,s;
NUM *head=&r;
int x,y;
printf("请输入想要创建的链表数\n");
scanf("%d",&x);
createlist(head,x);
getlist(r);
}
其实用return的方法和用指针的方法创建链表的方法没有多大的区别,只是,当return这个函数有其他需要的时候可以用指针直接创建链表
其次,指针法创建链表(*L)->next=s就储存了头节点的地址。