数据结构学习(三)

双向链表

typedef struct doulink
{
	int val;
	struct doulink* prev;
	struct doulink* next;
};

初始化

doulink* initdoulink()
{
	doulink* head = (doulink*)malloc(sizeof(doulink));
	doulink* temp = head;
	head->prev = NULL;
	head->next = NULL;
	head->val = 1;

	for (int i = 2; i < 5; i++)
	{
		doulink* a = (doulink*)malloc(sizeof(doulink));
		a->val = i;
		a->next = NULL;
		a->prev = temp;
		temp->next = a;
		temp = a;
	}

	return head;
}

打印

void printdoulink(doulink* dl)
{
	doulink* temp = dl;
	while (temp != NULL)
	{
		cout << temp->val << endl;
		temp = temp->next;
	}
}

插入(头插尾插另写)

doulink* insertdoulink(doulink* dl, int val, int num)
{
	doulink* temp = dl;
	for (int i = 1; i < num; i++)
	{
		if (temp == NULL)
		{
			cout << "wx" << endl;
			return dl;
		}
		temp = temp->next;
	}

	doulink* ndl = (doulink*)malloc(sizeof(doulink));
	ndl->val = val;
	doulink* a = temp->next;
	temp->next = ndl;
	ndl->prev = temp;
	ndl->next = a;
	a->prev = ndl;

	return dl;
}

循环链表

typedef struct xlink
{
    int val;
    struct xlink* next;
};

初始化

xlink* initxlink(int num)
{
	xlink* head = (xlink*)malloc(sizeof(xlink));
	xlink* temp = head;
	head->val = 1;
	head->next = NULL;

	for (int i = 2; i < num+1; i++)
	{
		xlink* a = (xlink*)malloc(sizeof(xlink));
		a->val = i;
		if (i == 5)
		{
			a->next = head;
		}
		else
		{
			a->next = NULL;
		}
		temp->next = a;
		temp = a;
	}
	return head;
}

打印

void printxlink(xlink* dl)
{
	xlink* temp = dl;
	xlink* flag = dl;
	while (temp != NULL)
	{
		cout << temp->val << endl;
		temp = temp->next;
		if (temp == flag) break;
	}
}

循环链表解决约瑟夫环

xlink* digui(xlink* xl,int num)
{
	if (xl == xl->next)
	{
		return xl;
	}

	xlink* temp = xl;

	for (int i = 1; i < num; i++)
	{
		temp = temp->next;
	}

	xlink* flag = temp;
	while (flag->next != temp)
	{
		flag = flag->next;
	}
	flag->next = temp->next;
	cout<<"出列:"<<temp->val<<endl;

	digui(temp->next, num);
}

//实现约瑟夫环
int xlinky(xlink* xl, int start, int num)
{
	xlink* temp = xl;
	for (int i = 1; i < start; i++)
	{
		temp = temp->next;
	}
	xlink* n = digui(temp, num);
	return n->val; //返回最后一个人
}

判断一个链表是否为环

最佳方法:快慢指针

bool ishuan(link* head)
{
    bool flag=false;
    link* fast,slow;
    fast=slow=head;
    while(fast!=NULL && slow!=NULL)
    {
        fast=fast->next->next;
        slow=slow->next;
        
        if(fast==slow)
        {
            flag=true;
        }
    }

    return flag;
}

俄罗斯轮盘赌小游戏

xlink* edigui(xlink* head)
{
	if (head->next == head)
	{
		return head;
	}

	int m = rand() % 6 + 1;  // 1 2 3 4 5 6
	xlink* temp = head;
	for (int i = 1; i < m; i++)
	{
		temp = temp->next;
	}
	xlink* flag = temp;
	while (flag->next != temp)
	{
		flag = flag->next;
	}
	flag->next = temp->next;
	cout << temp->val << "号死" << endl;

	edigui(temp->next);
}

//俄罗斯轮盘赌
int els(xlink* xl)
{
	xlink* temp = xl;
	xlink* a = edigui(temp);

	return a->val;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值