循环单链表
要求实现带头结点的循环单链表的创建和单链表的区间删除。
循环单链表类型定义:
typedef int Status;
typedef int ElemType; //假设线性表中的元素均为整型
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList; //循环单链表类型定义与单链表定义相同,区别在尾节点next取值
函数接口定义:
Status ListCreate_CL(LinkList &CL); //创建一个循环单链表
void ListDelete_CL(LinkList &CL,ElemType min,ElemType max);//删除取值大于min小于max的链表元素
void ListPrint_CL(LinkList &CL);
函数实现:
Status ListCreate_CL(LinkList &CL)//创建循环单链表
{
LNode *curPtr,*rearPtr;
int n;
scanf("%d",&n);
CL=(LNode *)malloc(sizeof(LNode));//头节点
CL->next=CL;
rearPtr=CL;
for(int i=0; i<n; i++)
{
curPtr = (LNode*)malloc(sizeof(LNode));
scanf("%d",&curPtr->data);
rearPtr->next=curPtr;
rearPtr=curPtr;
}
rearPtr->next=CL;
}
return OK;
}
void ListDelete_CL(LinkList &CL,ElemType min,ElemType max)
{
LNode *p,*q;
p=CL;//定义两个指针,一个指向CL,另一个只想前一个
while(p->next!=CL)//当没循环完一次时
{
q=p->next;//q 为p的下一链表地址
if(q->data >min && q->data <max)
{
p->next=q->next;
}
else
{
p=p->next;
}
}
}
void ListPrint_CL(LinkList &CL)
{ //输出单链表,空表时输出Empty List。
LNode *p=CL->next; //p指向第一个元素结点
if(p==CL){
printf("Empty List");
return;
}
while(p!=CL)
{
if(p->next!=CL)
printf("%d ",p->data);
else
printf("%d",p->data);
p=p->next;
}
}