先定义结点:
struct LinkList
{
int data;
struct LinkList *next;
};
头插法创建带头结点的单链表的函数:
头插法在每次插入新结点时都将新结点插到第一个结点的位置上,即在链表的头部插入。每次插入时都要先使新结点的后继变为头结点原来的后继,即头结点所链接的原第一个结点,再使头结点的后继变为新结点。
LinkList* CreateListHead(int *arr, int length) // 头插法创建带头结点的单链表
{
int i;
LinkList *head = (LinkList*)malloc(sizeof(LinkList)); // 创建头结点
head->data = length; // 头结点数据域存链表长度
head->next = NULL;
for(i=0; i<length; i++)
{
LinkList *p = (LinkList*)malloc(sizeof(LinkList)); // 为结点申请空间
p->data = arr[i]; // 节点数据域赋值
p->next = head->next; // 头插法
head->next = p;
}
return head; // 返回头结点
}
头插法创建无头结点的单链表:
LinkList* CreateListHead_noHNODE(int *arr, int length) // 头插法创建无头结点的单链表
{
int i;
LinkList *head; // 创建头指针 *head此时为一个指向LinkList型数据的指针
head = NULL;
for(i=0; i<length; i++)
{
LinkList *p = (LinkList*)malloc(sizeof(LinkList));
p->data = arr[i];
p->next = head; // 头插法
head = p; // 两指针指向同一地址
}
return head; // 返回第一个结点
}
尾插法创建带头结点的单链表的函数:
尾插法在每次插入新结点时都将新结点插到链表最后一个结点之后,即在链表的尾部插入。
LinkList* CreateListTail(int *arr, int length) // 尾插法创建带头结点的单链表
{
int i;
LinkList *head = (LinkList*)malloc(sizeof(LinkList)); // 创建头结点
head->data = length; // 头结点数据域存链表长度
head->next = NULL;
LinkList *r; // 记录链表中的尾结点
r = head;
for(i=0; i<length; i++)
{
LinkList *p = (LinkList*)malloc(sizeof(LinkList));
p->data = arr[i];
r->next = p; // 尾插法
p->next = NULL;
r = p;
}
return head; // 返回头结点
}
尾插法创建无头结点的单链表:
LinkList* CreateListTail_noHNODE(int *arr, int length) // 尾插法创建无头结点的单链表
{
int i;
LinkList *head;
if(length<1) // 传入为空时使头指针指向NULL
head = NULL;
else if(length>=1) // 传入非空时
{
LinkList *r; // 记录链表中的尾结点
head = (LinkList*)malloc(sizeof(LinkList)); // 先创建第一个结点,给数据域和指针域赋值
head->data = arr[0];
head->next = NULL;
r = head; // r记录表中的最后一个结点,当前为第一个结点
for(i=1; i<length; i++)
{
LinkList *p = (LinkList*)malloc(sizeof(LinkList));
p->data = arr[i];
r->next = p; // 尾插法
p->next = NULL;
r = p;
}
}
return head; // 返回第一个结点
}
整体代码(函数调用举例):
#include<stdio.h>
#include<stdlib.h>
struct LinkList
{
int data;
struct LinkList *next;
};
LinkList* CreateListHead(int *arr, int length) // 头插法创建带头结点的单链表
{
int i;
LinkList *head = (LinkList*)malloc(sizeof(LinkList)); // 创建头结点
head->data = length; // 头结点数据域存链表长度
head->next = NULL;
for(i=0; i<length; i++)
{
LinkList *p = (LinkList*)malloc(sizeof(LinkList));
p->data = arr[i];
p->next = head->next; // 头插法
head->next = p;
}
return head; // 返回头结点
}
LinkList* CreateListTail(int *arr, int length) // 尾插法创建带头结点的单链表
{
int i;
LinkList *head = (LinkList*)malloc(sizeof(LinkList)); // 创建头结点
head->data = length; // 头结点数据域存链表长度
head->next = NULL;
LinkList *r; // 记录链表中的尾结点
r = head;
for(i=0; i<length; i++)
{
LinkList *p = (LinkList*)malloc(sizeof(LinkList));
p->data = arr[i];
r->next = p; // 尾插法
p->next = NULL;
r = p;
}
return head; // 返回头结点
}
LinkList* CreateListHead_noHNODE(int *arr, int length) // 头插法创建无头结点的单链表
{
int i;
LinkList *head; // 创建头指针 *head此时为一个指向LinkList型数据的指针
head = NULL;
for(i=0; i<length; i++)
{
LinkList *p = (LinkList*)malloc(sizeof(LinkList));
p->data = arr[i];
p->next = head; // 头插法
head = p; // 两指针指向同一地址
}
return head; // 返回第一个结点
}
LinkList* CreateListTail_noHNODE(int *arr, int length) // 尾插法创建无头结点的单链表
{
int i;
LinkList *head;
if(length<1) // 传入为空时使头指针指向NULL
head = NULL;
else if(length>=1) // 传入非空时
{
LinkList *r; // 记录链表中的尾结点
head = (LinkList*)malloc(sizeof(LinkList)); // 先创建第一个结点,给数据域和指针域赋值
head->data = arr[0];
head->next = NULL;
r = head; // r记录表中的最后一个结点,当前为第一个结点
for(i=1; i<length; i++)
{
LinkList *p = (LinkList*)malloc(sizeof(LinkList));
p->data = arr[i];
r->next = p; // 尾插法
p->next = NULL;
r = p;
}
}
return head; // 返回第一个结点
}
void LinkListPrintf(LinkList *linklist) // 输出链表所有元素 若链表有头结点,则输出的第一个元素为头结点的数据域
{
while(linklist!=NULL)
{
printf("%d ", linklist->data);
linklist = linklist->next;
}
printf("\n");
}
int main()
{
int length = 5;
int a[length] = {1,2,3,4,123};
LinkList *h1 = CreateListHead(a, length);
LinkListPrintf(h1);
LinkList *h2 = CreateListHead_noHNODE(a, length);
LinkListPrintf(h2);
LinkList *h3 = CreateListTail(a, length);
LinkListPrintf(h3);
LinkList *h4 = CreateListTail_noHNODE(a, length);
LinkListPrintf(h4);
return 0;
}
输出结果为