自己码的代码虽然简单,但是基本上已经可以不看代码写出链表各种操作了。需要注意的是生成的循环链表去掉了头结点,从第一个有数据的结点开始,然后返回时需要将头结点地址返回,否则无法正常进行接下来的链表操作。如果不将头结点删除,那么就可以直接在原有链表上继续进行操作,但是相比之下没有删除之后方便,因为每次遍历完跳回到头结点时,又需要将头结点跳过,因为头结点里并未保存数据,之前做的约瑟夫问题就是这样,增加了代码量。
#include <stdio.h>
#define OK 1
#define ERROR 0
typedef int status;
typedef struct Node
{
int data;
struct Node* next;
}Node;
typedef struct Node* Linklist;
Linklist CreatLink(Linklist *L,int n)
{
Linklist p,r,head;
int i;
(*L)=(Linklist)malloc(sizeof(Node));
head=(Linklist)malloc(sizeof(Node));
r= (Linklist)malloc(sizeof(Node));
r=head=(*L);
for(i=0;i<n;i++)
{ p= (Linklist)malloc(sizeof(Node));
p->data=i+1;
r->next=p;
r=p;
}
r->next=head->next;
free(head);
return p->next;
}
status VisitList(Linklist L)
{
Linklist p;
int j=0;
p=(Linklist)malloc(sizeof(Node));
p=L;
//int i=5;
while( p->next != L)
{
printf("%d ",p->data);
p=p->next;
j++;
}
printf("%d ",p->data);
j++;
printf("链表长度为:%d\n",j);
return OK;
}
status LatinList(Linklist *L,int n)
{
Linklist p;int i,j,k;
p= (Linklist)malloc(sizeof(Node));
p=(*L);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("%d ",p->data);
p=p->next;
}
p=p->next;
printf("\n");
}
return OK;
}
int main()
{
Linklist L;
int n;
scanf("%d",&n);
L=CreatLink(&L,n);
//VisitList(L);
LatinList(&L,n);
}