【数据结构与算法】循环链表-拉丁矩阵

自己码的代码虽然简单,但是基本上已经可以不看代码写出链表各种操作了。需要注意的是生成的循环链表去掉了头结点,从第一个有数据的结点开始,然后返回时需要将头结点地址返回,否则无法正常进行接下来的链表操作。如果不将头结点删除,那么就可以直接在原有链表上继续进行操作,但是相比之下没有删除之后方便,因为每次遍历完跳回到头结点时,又需要将头结点跳过,因为头结点里并未保存数据,之前做的约瑟夫问题就是这样,增加了代码量。

#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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值