循环链表可以用来使计算机处理内存工作区或输出至数据缓冲区。
循环链表的插入和删除
#include"iostream"
#include"stdlib.h"
using namespace std;
struct clist
{
int data;
struct clist *next;
};
typedef struct clist cnode;
typedef cnode *clink;
/*-----循环链表的输出------*/
void printclist( clink head)
{
clink ptr;
head=head->next;
ptr=head;
do
{
printf("[%d]",ptr->data);
ptr=ptr->next;
}while(head!=ptr && head !=head->next);
printf("\n");
}
/*-----循环链表的结点插入----*/
clink insertnode(clink head,clink ptr,int value)
{
clink new_node;
new_node=(clink) malloc(sizeof(cnode));
if(!new_node)
return NULL;
new_node->data=value;
new_node->next=NULL;
if(head==NULL)
{
new_node->next=new_node;
return new_node;
}
if(ptr==NULL)
{
/*----情况1:插在第一结点之前---*/
new_node->next=head->next;
head->next->next=new_node;
}
else
{
/*-----情况2:插在结点之后-------*/
new_node->next=ptr->next;
ptr->next=new_node;
}
if(ptr==head)
head=new_node;
return head;
}
/*---循环链表结点删除---*/
clink deletenode(clink head,clink ptr)
{
clink previous;
if(head==NULL)
{
/*----情况1:删除第一个结点----*/
head->next=ptr->next;
}
else
{
/*--情况2:删除中间结点---*/
previous=head;
if(head!=head->next)
while(previous->next!=ptr)
previous=previous->next;
previous->next=ptr->next;
}
if(ptr==head)
head=previous;
free(ptr);
return head;
}
/*使用插入结点的方式来创建链表,完成后将链表内容输出,然后删除前后两结点*/
int main()
{
clink head=NULL;
int list[6]={9,7,3,4,5,6};
int i;
head=insertnode(head,head,list[0]);
printf("创建第一个结点: ");
printclist(head);
/*---情况1:插在第一结点前----*/
head=insertnode(head,NULL,list[1]);
printf("插入第一结点之前: ");
printclist(head);
for(i=2;i<6;i++)
{
/*---情况2:插在结点之后-----*/
head=insertnode(head,head->next,list[i]);
printf("插入结点之后: ");
printclist(head);
}
/*---情况1:删除第一个结点---*/
head=deletenode(head,head->next);
printf("删除第一个结点: ");
printclist(head);
/*--删除最后一个结点--*/
printf("删除最后一个结点: ");
head=deletenode(head,head);
printclist(head);
}