只是在单链表的程序上更改了生成链表,遍历链表和约瑟夫问题,其他部分功能程序代码还没有更改。但可以使用
#include <stdio.h>
#define ERROR 0
#define OK 1
#define ElemType int
#define N 10
typedef int status;
typedef struct Node
{
ElemType data;
struct Node* next;
}Node;
typedef struct Node* Linklist;
/*遍历链表元素并打印*/
status VisitList(Linklist L)
{
Linklist p;
int j=0;
p=(Linklist)malloc(sizeof(Node));
p=L->next;
while( p != L)
{
printf("%d ",p->data);
p=p->next;
j++;
}
printf("链表长度为:%d\n",j);
return OK;
}
/*获取链表长度*/
int ListLength(Linklist L)
{
Linklist p;
//p=(Linklist)malloc(sizeof(Node));
int i=0;
p=L->next;
while( p!=L )
{
p=p->next;
i++;
}
return i;
}
/*使用尾插法创建长度为n的循环链表*/
status CreateListTail(Linklist *L,int n)
{
Linklist r,p;
int j;
*L=(Linklist)malloc(sizeof(Node));
r=(Linklist)malloc(sizeof(Node));
r=*L;
srand(time(0));
for(j=0;j<n;j++)
{
p=(Linklist)malloc(sizeof(Node));
p->data=j+1;
r->next=p;
r=p;
}
r->next=(*L);
VisitList(*L);
return OK;
}
/*使用快慢指针法求得链表中间值*/
status ListlinkMid(Linklist L,ElemType *e)
{
Linklist mid,search;
mid=search=L;
while((search->next)!=NULL)
{
if((search->next->next)!=NULL)
{
search=search->next->next;
mid=mid->next;
}
else
{
search=search->next;
}
}
mid=mid->next;
*e=mid->data;
return OK;
}
/*---获取链表第i个元素----*/
/*其中1<=i<=ListLength(L)*/
status GetElem(Linklist L,int i,ElemType *e)
{
Linklist p;
int j=1;
p=L->next;
if((i<1)|| (i>ListLength(L)))
{
return ERROR;
}
while(j<i)
{
p=p->next;
j++;
}
*e=p->data;
return OK;
}
/*---在链表第i个元素之前插入值e----*/
/*-----其中1<=i<=ListLength(L)----*/
status ListInsert(Linklist *L,int i,ElemType e)
{
Linklist p,s;
p=*L;
int j;
if((i<1)||(i>ListLength(*L)))
{
return ERROR;
}
for(j=1;j<i;j++)
{
p=p->next;
}
s=(Linklist)malloc(sizeof(Node));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
/*----------删除链表第i个元素------*/
/*-----其中1<=i<=ListLength(L)----*/
status ListDelete(Linklist *L,int i)
{
Linklist p,q;
p=*L;
int j;
if((i<1)||(i>ListLength(*L)))
{
return ERROR;
}
for(j=1;j<i;j++)
{
p=p->next;
}
q=p->next;
p->next=q->next;
free(q);
return OK;
}
/*------------链表整表删除---------*/
/*-----其中1<=i<=ListLength(L)----*/
status ClearList(Linklist *L)
{
Linklist p,q;
p=(*L)->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
(*L)->next = NULL;
return OK;
}
status YSFquestion(Linklist *L)
{
Linklist p;
int i=ListLength(*L);
printf("%d\n",i);
int temp=1;
p=(*L)->next;
while(i>2)
{
p=p->next;
if(p->data !=0 )
temp++;
if(temp==3)
{
temp=0;
i--;
printf("%d ,",p->data);
p->data=0;
if(p->next==(*L))
p=p->next;
}
}
return OK;
}
/*status YSFquestion(Linklist *L)
{
Linklist p;int k=1;
p=(*L)->next;
while( p != (*L))
{
p->data=k;
k++;
p=p->next;
}
printf("参与人数:\n");
VisitList(*L);
int i=ListLength(*L);
Linklist temp;
p=(*L);
printf("退出顺序:\n");
while(p != p->next)
{
for(i=1;i<3;i++)
{
p=p->next;
if( (p == (*L)) || (p->next ==(*L)))
p=p->next;
}
printf("%d ",p->next->data);
temp=p->next;
p->next=temp->next;
free(temp);
}
printf("\n");
return OK;
}*/
int main()
{
int x,n;
ElemType e;
Linklist L;
int CMR;
printf("请输入:\n");
printf("1.查询链表:\n");
printf("2.创建链表:\n");
printf("3.查找中点:\n");
printf("4.查找元素:\n");
printf("5.插入元素:\n");
printf("6.删除元素:\n");
printf("7.删除链表:\n");
while(scanf("%d",&x)!=EOF){
switch(x)
{
case 1: CMR=VisitList(L);
if(CMR)
printf("OK\n");
else
printf("ERROR\n");
break;
case 2:CMR=CreateListTail(&L,N);
if(CMR)
{
printf("OK\n");
}
else
printf("ERROR\n");
break;
case 3: CMR=ListlinkMid(L,&e);
if(CMR)
{
printf("mid is:%d\n",e);
printf("OK\n");
}
else
printf("ERROR\n");
break;
case 4: printf("请输入查找元素:");
scanf("%d",&n);
CMR=GetElem(L,n,&e);
if(CMR)
{
printf("the %d number is:%d\n",n,e);
printf("OK\n");
}
else
printf("ERROR\n");
break;
case 5:printf("请输入位置和元素:");
scanf("%d,%d",&n,&e);
CMR=ListInsert(&L,n,e);
if(CMR)
{
VisitList(L);
printf("OK\n");
}
else
printf("ERROR\n");
break;
case 6: printf("请输入删除元素:");
scanf("%d",&n);
CMR=ListDelete(&L,n);
if(CMR)
{
VisitList(L);
printf("OK\n");
}
else
printf("ERROR\n");
break;
case 7: CMR=ClearList(&L);
if(CMR)
printf("OK\n");
else
printf("ERROR\n");
break;
case 8: CMR=YSFquestion(&L);
if(CMR)
printf("OK\n");
else
printf("ERROR\n");
break;
default:printf("输入有误\n");
break;
}
}
return 0;
}