头插法
/* 头插法(每次新结点都插入在头结点后,第一个数据结点之前),形成逆序的单链表 */
//注意: 定义指针变量,为了安全起见和习惯,一般需要初始化为NULL
#include <stdio.h>
#include <stdlib.h> //malloc函数的依赖
typedef int ElemType; //重命名int为ElemType
//结点定义
typedef struct LNode
{
ElemType data; //数据域
struct LNode *next; //指针域
} LNode, *LinkList; //结构体的一个普通变量(用于数据结点)和一个指针变量(用于头结点)
//创建链表(头插法): 传入指向链表头结点的头指针作为形参
LinkList Creat_list(LinkList head)
{
head = (LinkList)malloc(sizeof(LNode)); //为头指针(头结点)开辟内存空间,由于malloc返回的是空指针类型,故前面才需进行强转
head->next = NULL; //没有数据结点,故初始化头结点的指针域为空
LNode *node = NULL; //定义工作指针,即用于辅助的指针变量,且安全起见初始化为NULL
int count = 0; //初始化已创建的数据结点的个数为0
printf("(head insert)Please input the number of Node: ");
scanf("%d", &count); //输入需要创建的数据结点的个数
//开始构造链表
for (int i = 0; i < count; i++)
{
node = (LNode *)malloc(sizeof(LNode)); // 为新结点开启一个结点的内存空间
node->data = i; //数据域的赋值
//指针域的赋值,即新结点 插入 前驱结点头结点的后面(从右往左)
node->next = head->next;
head->next = node;
}
//返回指向头结点的指针,即头指针
return head;
}
//test,打印链表
void main()
{
LinkList head = NULL;
LinkList linkList = Creat_list(head);
LNode *p = linkList->next; //指向第一个数据结点
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
}
尾插法
/*尾插法(每次新结点都插入在尾结点后)
(为了提高查找尾结点的效率,需新定义一个尾指针专门指向尾结点,且始终指向尾结点)
(尾结点是带有数据的数据结点,而头结点是不带数据的)*/
#include <stdio.h>
#include <stdlib.h> //malloc函数的依赖
typedef int ElemType; //重命名int为ElemType
//结点定义
typedef struct LNode
{
ElemType data; //数据域
struct LNode *next; //指针域
} LNode, *LinkList; //结构体的一个普通变量和一个指针变量(用于数据结点)和一个指针变量(用于头结点/尾结点)
//创建链表(尾插法): 传入指向链表头结点的头指针作为形参
LinkList Creat_list(LinkList head)
{
head = (LinkList)malloc(sizeof(LinkList)); //为头指针(头结点)开辟内存空间
head->next = NULL; //没有数据结点,故初始化头结点的指针域为空
LNode *end = NULL; // 定义尾指针变量并初始化为NULL
end = head; //没有数据结点,故尾指针初始化指向头结点
LNode *node = NULL; //定义工作指针,即用于辅助的指针变量,初始化为NULL
int count = 0; //初始化已创建的数据结点的个数为0
printf("(tail insert)Please input the number of Node: ");
scanf("%d", &count);
//开始构造链表
for (int i = 0; i < count; i++)
{
node = (LNode *)malloc(sizeof(LNode)); // 为新结点开启一个结点的内存空间
node->data = i; //数据域的赋值
//指针域的赋值,即新结点 插入 尾结点的后面
end->next = node; //新结点连接在尾结点的后面
end = node; //新结点成为新的尾结点
}
end->next = NULL; //链表构造结束,令尾指针指向的尾结点的指针域为NULL
//返回指向头结点的指针,即头指针
return head;
}
//test,打印链表
void main()
{
LinkList head = NULL;
LinkList linkList = Creat_list(head);
LNode *p = linkList->next; //指向第一个数据结点
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
}