循环链表
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表成为单循环链表,简称循环链表。
- 这里并不是说循环链表一定要有头结点。
- 其实循环链表的单链表的主要差异就在于循环的 判断空链表的条件上,原来判断head->next是否为null,现在则是head->next是否等于head。
- 由于终端结点用尾指针rear指示,则查找终端结点是O(1),而开始结点是rear->next->next,当然也是O(1)。
/*初始化循环链表*/
void ds_init(node **Node)
{
int item;
int *temp;
int *target;
printf("输入结点的值,输入0完成初始化\n");
while(1)
{
scanf("%d",&item);
fflush(stadin);
if(item==0)
{
return;
}
if((*pNode)==NULL)
{ /*循环链表中只有一个结点*/
*pNode=(node*)malloc(sizeof(struct CLinkList));
if(!(*pNode))
exit(0);
(*pNode)->data=item;
(*pNode)->next=*pNode;
}
else
{
/*找到next指向第一个结点的结点*/
for(target=(*pNode);target->next!=(*pNode);target=target->next);
/*生成一个新的结点*/
temp=(node *)malloc(sizeof(struct CLinkList));
if(!temp)
exit(0);
temp->data=item;
temp->next=*pNode;
target->next=temp;
}
}
}
/*链表存储结构的定义*/
typedef struct CLinkList
{
int data;
struct CLinkList *next;
}node;
/*插入结点*/
/*参数:链表的第一个结点,插入的位置*/
void ds_insert(node **pNode,int i)
{
int item;
node *temp;
node *target;
node *p;
int j=1;
printf("输入要插入结点的值:");
scanf("%d",&item);
if(i==1)
{
//新插入的结点作为第一个结点
temp=(node *)malloc(sizeof(struct CLinkList));
if(!temp)
exit(0);
temp->data=item;
/*寻找最后一个结点*/
for(target=(*pNode);target->next!=(*pNode);target=target->next);
temp->next=(*pNode);
target->next=temp;
*pNode=temp;
}
else
{
target=*pNode;
for(;j<(i-1);++j)
{
taget=target->next;
}
temp=(node *)malloc(sizeof(struct CLinkList));
if(!temp)
exit(0);
temp->data=item;
p=target->next;
target->next=temp;
temp->next=p;
}
}
/*删除结点*/
void ds_delete(node **pNode,int i)
{
node *target;
node *temp;
int j=1;
if(i==1)
{
//删除的是第一个结点
/*找到最后一个结点*/
for(target=*pNode;target->next!=*pNode;target=target->next);
temp=*pNode;
*pNode=(*pNode)->next;
target->next=*pNode;
free(temp);
}
else
{
target=*pNode;
for(;j<i-1;++j)
{
target=target->next;
}
temp=target->next;
target->next=temp->next;
free(temp);
}
}
/*返回结点所在位置*/
int ds_search(node *pNode,int elem)
{
node *target;
int i=1;
for(target=pNode;target->data!=elem && target->next!=pNode;++i)
{
target=target->next;
}
if(target->next==pNode) /*表中不存在该元素*/
return 0;
else
return 1;
}