循环链表

来源:互联网 发布:app软件产品说明书 编辑:程序博客网 时间:2024/06/05 13:24

 

/*循环链表 */
/* 程序说明 */
/* 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;
}

0 0
原创粉丝点击