一、循环链表
框架构建(头插法)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
struct hnode
{
int num;
struct hnode * next;
};
typedef struct hnode Hnode;
typedef Hnode * Hlink;
void create_new_node(Hlink *new_node)
{
*new_node=(Hlink)malloc(sizeof(Hnode));
}
void create_hlink(Hlink *head)
{
create_new_node(head);
(*head)->next=*head;
}
void insert_node_head(Hlink head,Hlink new_node)
{
new_node->next=head->next;
head->next=new_node;
}
void display_link(Hlink head)
{
Hlink p=NULL;
if(NULL==head)
{
printf("no such link!\n");
}
else if(head==head->next)
{
printf("link is empty!\n");
}
else
{
p=head->next;
while(p!=head)
{
printf("%d\n",p->num);
p=p->next;
}
}
}
void make_empty(Hlink head)
{
Hlink p=NULL;
p=head->next;
while(p!=head)
{
head->next=p->next;
free(p);
p=head->next;
}
}
void release_link(Hlink *head)
{
make_empty(*head);
free(*head);
*head=NULL;
}
int main()
{
int i;
int loc;
Hlink head=NULL;
Hlink new_node=NULL;
srand((unsigned)time(NULL));
create_hlink(&head);
for(i=0;i<10;i++)
{
create_new_node(&new_node);
new_node->num=rand()%100;
//new_node->num=i+1;
insert_node_head(head,new_node);
}
display_link(head);
release_link(&head);
display_link(head);
return 0;
}
尾插法
函数定义
void insert_node_tail(Hlink head,Hlink new_node)
{
Hlink p=NULL;
p=head;
while(p->next!=head)
{
p=p->next;
}
p->next=new_node;
new_node->next=head;
}
主函数中编写及调用
insert_node_tail(head,new_node);
将随机取值从小到大排序
函数定义
void insert_node_sort(Hlink head,Hlink new_node)
{
Hlink p=NULL;
Hlink q=NULL;
q=head;
p=head->next;
while(p!=head&&p->num<new_node->num)
{
q=p;
p=p->next;
}
q->next=new_node;
new_node->next=p;
}
主函数中编写及调用
insert_node_sort(head,new_node);
中间插入法
函数定义
void insert_node_mid(Hlink head,Hlink new_node,int loc)
{
Hlink p=NULL;
Hlink q=NULL;
q=head;
p=head->next;
while(p!=head&&p->num!=loc)
{
q=p;
p=p->next;
}
q->next=new_node;
new_node->next=p;
}
主函数中编写及调用
printf("please input location:\n");
scanf("%d",&loc);
create_new_node(&new_node);
printf("please input num:\n");
scanf("%d",&new_node->num);
insert_node_mid(head,new_node,loc);
删除操作
函数定义
void delete_node(Hlink head,int num)
{
Hlink p=NULL;
Hlink q=NULL;
q=head;
p=head->next;
while(p!=head&&p->num!=num)
{
q=p;
p=p->next;
}
q->next=p->next;
free(p);
}
主函数中编写及调用
printf("please input location:\n");
scanf("%d",&loc);
delete_node(head,loc);
printf("delete:\n");
长度测量
函数定义
int length_Hlink(Hlink head)
{
int i=0;
Hlink p=NULL;
p=head->next;
while(p!=head)
{
i++;
p=p->next;
}
printf("the length is %d\n",i);
}
主函数中编写及调用
length_Hlink(head);
二、双向循环链表
框架构建(头插法)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
struct dhnode
{
int num;
struct dhnode * perior;
struct dhnode * next;
};
typedef struct dhnode Dhnode;
typedef Dhnode * Dhlink;
void create_new_node(Dhlink *new_node)
{
*new_node=(Dhlink)malloc(sizeof(Dhnode));
}
void create_dhlink(Dhlink *head)
{
create_new_node(head);
(*head)->perior=(*head)->next=(*head);
}
void insert_node_head(Dhlink head,Dhlink new_node)
{
new_node->perior=head;
new_node->next=head->next;
head->next=new_node;
new_node->next->perior=new_node;
}
void display_dhlink(Dhlink head)
{
Dhlink p=NULL;
if(NULL==head)
{
printf("no such link!\n");
}
else if(head==head->next)
{
printf("link is empty!\n");
}
else
{
p=head->next;
while(p!=head)
{
printf("%d\n",p->num);
p=p->next;
}
}
}
void make_empty(Dhlink head)
{
Dhlink p=NULL;
p=head->next;
while(p!=head)
{
head->next=p->next;
p->next->perior=p->perior;
free(p);
p=head->next;
}
}
void release_dhlink(Dhlink * head)
{
make_empty(*head);
free(*head);
*head=NULL;
}
int main()
{
Dhlink head=NULL;
Dhlink new_node=NULL;
int i;
int loc;
srand((unsigned)time(NULL));
create_dhlink(&head);
for(i=0;i<10;i++)
{
create_new_node(&new_node);
new_node->num=rand()%100;
//new_node->num=i+1;
insert_node_head(head,new_node);
}
display_dhlink(head);
release_dhlink(&head);
display_dhlink(head);
return 0;
}
尾插法
函数定义
void insert_node_tail(Dhlink head,Dhlink new_node)
{
Dhlink p=NULL;
p=head;
while(p->next!=head)
{
p=p->next;
}
new_node->perior=p;
p->next=new_node;
new_node->next=head;
head->perior=new_node;
}
主函数中编写和调用
insert_node_tail(head,new_node);
将随机取值加以排序
函数定义
void insert_node_sort(Dhlink head,Dhlink new_node)
{
Dhlink p=NULL;
Dhlink q=NULL;
q=head;
p=head->next;
while(p!=head&&p->num<new_node->num)
{
q=p;
p=p->next;
}
new_node->perior=q;
q->next=new_node;
new_node->next=p;
p->perior=new_node;
}
主函数中编写和调用
insert_node_sort(head,new_node);
中间插入法
函数定义
void insert_node_mid(Dhlink head,Dhlink new_node,int loc)
{
Dhlink p=NULL;
Dhlink q=NULL;
q=head;
p=head->next;
while(p!=head&&p->num!=loc)
{
q=p;
p=p->next;
}
new_node->perior=q;
q->next=new_node;
new_node->next=p;
p->perior=new_node;
}
主函数中编写和调用
printf("please input location:\n");
scanf("%d",&loc);
create_new_node(&new_node);
printf("please input num:\n");
scanf("%d",&new_node->num);
insert_node_mid(head,new_node,loc);
反向输出
函数定义
void reverse_display_dhlink(Dhlink head)
{
Dhlink p=NULL;
if(NULL==head)
{
printf("no such link!\n");
}
else if(head==head->perior)
{
printf("link is empty!\n");
}
else
{
p=head->perior;
while(p!=head)
{
printf("%d\n",p->num);
p=p->perior;
}
}
}
主函数中编写和调用
reverse_display_dhlink(head);
删除操作
函数定义
void delete_node(Dhlink head,int loc)
{
Dhlink p=NULL,q=NULL;
q=head;
p=head->next;
while(p!=head&&p->num!=loc)
{
q=p;
p=p->next;
}
q->next=p->next;
p->next->perior=q;
free(p);
}
主函数中编写和调用
printf("please input location:\n");
scanf("%d",&loc);
delete_node(head,loc);
长度测量
函数定义
void length_node(Dhlink head)
{
int i=0;
Dhlink p=NULL;
p=head->next;
if(head->next==head)
{
printf("link is empty!\n");
}
while(p!=head)
{
i++;
p=p->next;
}
printf("the length is %d\n",i);
}
主函数中编写和调用
length_node(head);