循环链表就是普通的单链表,最后一个元素存的地址本来是NULL,现在改成头结点的地址,从而形成循环.
#include <stdio.h>
#include <stdlib.h>
#define MAX(X,Y) (X>Y?X:Y)
#include <math.h>
//尾部插入法创建一个包含5个元素的循环链表,从一个开始元素依次插入到头部
typedef struct S//创建一个链表元素
{
int data;//数据域
struct S* p;//地址域,指向下一个元素的地址
}S;
void creat_Linklist(S* L, int n)
{
L->p = NULL;//创建一个空链表
L->data = 0;
int i = 0;
int input = 0;
S* tmp = L;//创建一个临时指针变量,使这个指针始终指向最后一个元素
for(i = 0;i < n;i++)//循环5次,创建五个元素
{
S* a = (S*)malloc(sizeof(S));//给元素申请一个空间,并把空间地址保存下来
if(i !=5)
{
a->p = tmp->p;//把临时指针变量的地址域值赋值给该元素地址域
}
else
{
a->p = L;//把最后一个元素的址址域的值改为头结点地址
L = a;//最后把入口地址改为最后一个元素的地址,形成循环.
}
tmp->p = a;//再把该元素的地址给临时指针变量
tmp = a;//把临时指针变量指向该元素,下次循环的时候就是新插入的元素和这个元素交换地址
scanf("%d",&input);//输入你想给元素数据域data赋的值
a->data = input;//给元素赋值,创建完成!
}
for(i = 0; i < 20; i++)
{
printf("%d ",L->data);//输放123456 输出从最后一位开始6012345
L = L->p;
}
}
int main()
{
S* head = (S*)malloc(sizeof(S));//创建一个空链表
int n = 6;
creat_Linklist(head, n);
return 0;
}
2,创建一个双链表
#include <stdio.h>
#include <stdlib.h>
#define MAX(X,Y) (X>Y?X:Y)
#include <math.h>
//尾部插入法创建一个包含6个元素的循环链表,从一个开始元素依次插入到尾部
typedef struct S//创建一个元素类型,并且重定义类型名为S
{
struct S* pre;//地址域,指向上一个元素的地址
int data;//数据域
struct S* next;//地址域,指向下一个元素的地址
}S;
void creat_Linklist(S* L, int n)
{
L->pre = NULL;//初始化头结点
L->data = 0;//数据域
L->next = NULL;
int i = 0;
int input = 0;
S* tmp = L;//创建一个临时指针变量,使这个指针始终指向最后一个元素
for(i = 0;i < n;i++)//循环6次,创建6个元素
{
S* a = (S*)malloc(sizeof(S));//给元素申请一个空间,并把空间地址保存下来
a->next = NULL;//元素的后继赋值为NULL
a->pre = tmp;//元素的前趋赋值为上一个结点的地址
tmp->next = a;//把临时指针变量指向的元素的后继赋值为 插入元素的地址
tmp = a;//把临时指针变量指向最后一个元素(也就是新插入的元素)
scanf("%d",&input);//输入你想给元素数据域data赋的值
a->data = input;//给元素赋值,创建完成!
}
for(i = 0; i < 6; i++)
{
L = L->next;
printf("我现在的结点值为%d ",L->data);//输放123456 输出从最后一位开始123456
printf("我前面结点的值为%d ",L->pre->data);
if(L->next != NULL)
{
printf("我后面结点的值为%d\n",L->next->data);
}
else
{
printf("我后面已经没有结点了呀");
}
}
}
int main()
{
S* head = (S*)malloc(sizeof(S));//创建一个空链表
int n = 6;
creat_Linklist(head, n);
return 0;
}
依次给6个元素赋值1 2 3 4 5 6,结果为:
3:创建双向循环链表
#include <stdio.h>
#include <stdlib.h>
#define MAX(X,Y) (X>Y?X:Y)
#include <math.h>
//尾部插入法创建一个包含6个元素的循环链表,从一个开始元素依次插入到尾部
typedef struct S//创建一个元素类型,并且重定义类型名为S
{
struct S* pre;//地址域,指向上一个元素的地址
int data;//数据域
struct S* next;//地址域,指向下一个元素的地址
}S;
void creat_Linklist(S* L, int n)
{
L->pre = NULL;//初始化头结点
L->data = 0;//数据域
L->next = NULL;
int i = 0;
int input = 0;
S* tmp = L;//创建一个临时指针变量,使这个指针始终指向最后一个元素
for(i = 0;i < n;i++)//循环6次,创建6个元素
{
S* a = (S*)malloc(sizeof(S));//给元素申请一个空间,并把空间地址保存下来
a->next = L;//元素的后继赋值为头结点地址;
a->pre = tmp;//元素的前趋赋值为上一个结点的地址
tmp->next = a;//把临时指针变量指向的元素的后继赋值为 插入元素的地址
tmp = a;//把临时指针变量指向最后一个元素(也就是新插入的元素)
scanf("%d",&input);//输入你想给元素数据域data赋的值
a->data = input;//给元素赋值,创建完成!
}
L->pre = tmp;//6个元素插入成功后,tmp指向最后一个元素的地址,把它赋值给头结点的前趋,完成整个循环的闭环
for(i = 0; i < 20; i++)//这个链表是无限循环的,我们先循环20次来看看效果
{
L = L->next;
printf("我现在的结点值为%d ",L->data);//输入123456,看看屏幕打印出来的值
printf("我前面结点的值为%d ",L->pre->data);
printf("我后面结点的值为%d\n",L->next->data);
}
}
int main()
{
S* head = (S*)malloc(sizeof(S));//创建一个空链表
int n = 6;
creat_Linklist(head, n);
return 0;
}
输入1 2 3 4 5 6,结果可以看出确实为双循环双链: