C语言:链表的循环,两种思考方法,第一种用select_1()实现,第二种用select_2()实现.

#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
struct s
{
	int n;
	struct s *next;
};
int i;
struct s *head, *tail;
void creat(m)
{
	struct s *p, *p1;
	head = NULL; 
	for(i=0; i<m; i++)
	{
		p = (struct s*)malloc(sizeof(struct s));
		printf("Num %d: ", i+1);
		scanf("%d", &p->n);
		if(i==0)
			head = p;
		else
			p1->next = p;
		p1 = p;
	}
	tail = p1;
	tail->next = head;
}
void select_1(int m)//第一种循环方法
{
	struct s *p, *q;
	int w=0;
	p = tail;
	while( p != p->next)
	{
		w++;
		q = p, p = p->next;
		if( w%m == 0)
		{
			printf("\nDelete the number: %d\n", p->n); 
			q->next = p->next;
			free(p); 
			p = q->next; //不能写成 p = p->next,因为free(p),已释放p节点所占用的内存空间.
			w++;
		}
	}
	printf("\nOutput circular list the last node: %d\n\n", p->n);
}

void select_2(int m)//第二种循环循环方法
{
	struct s *p, *q;
	int w=0;
	q = tail;
	while( q != q->next)
	{
		w++; 
		p = q->next;
		if( w%m == 0)
		{
			printf("\nDelete the number: %d\n", p->n); 
			q->next = p->next;
			free(p);
		}
		else
			q = q->next;
	}
	printf("\nOutput circular list the last node: %d\n\n", q->n);
}

void main()
{
	int a, n, b, m;
	printf("                                 \nPlease input the list nodes number: ");
	scanf("%d", &a);
	printf("\n");
	creat(a);

	printf("\nPlease input the interval: ");
	scanf("%d", &n);
	select_1(n);
	
	printf("                                 \nPlease input the list nodes number: ");
	scanf("%d", &b);
	creat(b);	
	printf("\n");

	printf("\nPlease input the interval: ");
	scanf("%d", &m);
	select_2(m);
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值