循环链表的插入和删除

循环链表可以用来使计算机处理内存工作区或输出至数据缓冲区。

循环链表的插入和删除

#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);
}

 

posted @ 2010-11-20 11:23  聊聊IT那些事  阅读(2479)  评论(0编辑  收藏  举报