/*循环链表 */
/* 程序说明 */
/* 1. rear为尾指针 head为头指针 */
/* 2. 头结点数据域存放链表长度 */
/* 3. 创建循环链表后,指针指向最后一位
/* 4. 输出时,从最后一个开始,然后到头结点(头结点数据域存放链表长度)*/
/**********************************************************************/
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
#define LISTEND 2
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode;
typedef LNode *LinkList;
void InitList(LNode *&L)
{
L->data=0;
L->next=L;
}
LinkList List_Add(LNode * L)
{
printf("Input n:");
int n;
scanf("%d",&n);
LinkList head=L,p;
printf("Please input %d Element:\n",n);
for(int i=0;i<n;i++)
{
while(L->next!=head) L=L->next;
p=(LNode*)malloc(sizeof(LNode));
scanf("%d",&(p->data));
L->next=p;
p->next=head;
}
head->data+=n;
printf("OK\n");
return p;
}
Status Link_length(LinkList L) //返回链表长度
{
return L->next->data;
}
LinkList Link_head(LinkList L) ///返回头结点
{
L=L->next;
return L;
}
LinkList Link_rear(LinkList L) /// 返回尾结点
{
return L;
}
void Link_print(LNode *L) /// 输出循环链表,从尾结点开始
{
LinkList rear=L,head=Link_head(L);
while(L->next!=rear)
{
if(L==head) printf("(%d)->",L->data);
else printf("%d->",L->data);
L=L->next;
}
printf("%d\n",L->data);
}
Status Link_locate(LinkList L) /// 查找元素位置
{
LinkList rear=L,head=Link_head(L);
ElemType e;
printf("Input a ElemType:");
int i=Link_length(L),find=0;
scanf("%d",&e);
printf("Position:");
for(int j=i;j>=0;j--,L=L->next)
{
if(L == head) continue; /// 跳过头结点
if(L->data == e)
{
printf(" %d",i);
find=1;
}
i++;
if(i>Link_length(L)) i=1;
}
if(!find)
{
printf("NOT FIND !");
return 0;
}
printf("\n");
return 1;
}
Status Link_insert(LinkList L)
{
printf("Position:");
int pos,i=0,l=Link_length(L);
scanf("%d",&pos);
if(pos<0 || pos>l)
{
printf("ERROR!\n");
return ERROR;
}
printf("Element:");
LinkList head=Link_head(L);
L=head;
while(i<pos)
{
L=L->next;
i++;
}
LinkList p=(LinkList)malloc(sizeof(LNode)),q;
scanf("%d",&(p->data));
q=L->next;
L->next=p;
p->next=q;
head->data++;
if(pos == l) return LISTEND;
return OK;
}
LinkList Link_delete(LinkList L) ///删除pos后一位
{
int pos;
printf("Position:");
scanf("%d",&pos);
int l=Link_length(L);
if(pos<0 || pos>l)
{
printf("ERROR!\n");
return ERROR;
}
if(pos == l) pos=0; ///如果删除的是尾结点后一位的后一位 ---> 删除头结点后一位
LinkList rear=Link_rear(L),p,head=Link_head(L);
while(L->next !=rear) L=L->next;
rear=L;
// printf("尾结点前一位:%d\n",rear->data); ///尾结点向前移一位,产生新的尾结点
if(pos != l-1) rear=rear->next; /// 经调试得出
L=head;
int i=0;
while(i<pos)
{
L=L->next; ///
i++;
}
p=L->next;
L->next=p->next;
free(p);
head->data--;
printf("OK\n");
return rear; /// 返回新的尾结点指针
}
Status Select()
{
printf("\n\t\t\t1. Output .\n");
printf("\t\t\t2. Insert .\n");
printf("\t\t\t3. Delete .\n");
printf("\t\t\t4. Find .\n");
printf("\t\t\t5. Length .\n");
printf("\t\t\t6. Exist .\n");
printf("\t\tSelect:");
Status chiose;
scanf("%d",&chiose);
return chiose;
}
int main()
{
LinkList CLNode=(LinkList)malloc(sizeof(LNode)),rear,head;
InitList(CLNode);
rear=List_Add(CLNode); ///指向尾结点的指针
head=Link_head(CLNode); ///指向头结点的指针
while(true)
{
switch(Select())
{
case 1:Link_print(rear);break;
case 2:
{
if(Link_insert(rear)==LISTEND) ///如果插在尾结点后,尾结点向后移一位
rear=rear->next;
break;
}
case 3:
{
rear=Link_delete(rear);
break;
}
case 4:Link_locate(rear);break;
case 5:printf("Length is: %d\n",Link_length(rear));break;
case 6:return 0;
default :printf("Input ERROR,Input again!\n");
}
}
return 0;
}