1.1单链表

#include<iostream>
using namespace std;

typedef struct node
{
	int data;
	struct node *next;
}LNode,*LinkList;


//创建空单链表
LinkList Creat_LinkList(void)
{
	LinkList H=(LinkList)malloc(sizeof(LNode));
    if(H)               //确认头结点创建是否成功
	{
		H->next=NULL;
	}
	return H;
}
//销毁单链表
void Destroy_LinkList(LinkList *H)
{
	LinkList p,q;
	p=*H;
	while(p!=p->next)
	{
		q=p;
		p=p->next;
		free(q);
	}
	free(p);
	*H=NULL;
}
//求表长(循环链表求表长)
int Length_LinkList(LinkList H)
{
	if(H->next==NULL) 
		return 0;
	LinkList p=H->next;
	LinkList q=H->next;
	int count=1;
	while(p->next!=q)
	{
		p=p->next;
		count++;
	}
	return count;
}
//查找操作
//按序号查找
LinkList Locate_LinkList_Pos(LinkList H,int i)
{
	//i不正确或链表不存在,则返回NULL,i==0返回头指针,否则返回第i个结点的指针
	LinkList p;
	int j;
	p=H;
	j=0;
	while(p&&j<i)
	{
		p=p->next;
		j++;
	}
	if(j!=i||!p)
	{
		cout<<"i不正确或链表不存在!";
		return NULL;
	}
	return p;
}
//按值查找
LinkList Locate_LinkList_Value(LinkList H,int x)
{
	//查找值为x的结点  返回其指针,否则返回NULL
	LinkList p=H->next;
	while(p&&H->data!=x)
	{
		p=p->next;
	}
	return p;
}
//插入
int Insert_LinkList(LinkList H,int x)
{
	
	LinkList p,q;
	p=(LinkList)malloc(sizeof(LNode));
	if(!p)
	{
		cout<<"申请空间失败!";
		return 0;
	}

	if(H->next==NULL)//当链表为空时,插入第一个元素
	{
		p->data=x;
		H->next=p;
	    p->next=H->next;
	}
	else             //在头指针和最后一个元素之间插入
	{
		p->data=x;
		q=H->next;
		while(q->next!=H->next)
		{
			q=q->next;
		}
		q->next=p;
		p->next=H->next;
	}
	return 1;
}
//删除
int Del_LinkList(LinkList H,int i)
{
	//删除第i个结点
	LinkList p,q;
	if(H==NULL||H->next==NULL)
	{
		cout<<"链表不存在或空表不能删除!";
		return 0;
	}
	p=Locate_LinkList_Pos(H,i-1);
	if(p==NULL||p->next==NULL)
	{
		cout<<"i有误!";
		return 0;
	}
	q=p->next;
	p->next=q->next;
	free(q);
	return 1;
}

int josephus_LinkList(LinkList josephus_Link,int s,int m)
{
	//入口参数为已存在的链表头指针,起始位置s,报数到m
	LinkList p,pre;
	int i;
	if(!josephus_Link)
	{
		cout<<"表中无元素!";
		return 0;
	}
	p=josephus_Link;
	for(i=0;i<s;i++)
		p=p->next;    //用p作为第s个结点指针(开始结点)
	cout<<"输出约瑟夫序列:"<<endl;
	while(p!=p->next)  //当不止一个元素时
	{
		for(i=1;i<m;i++)   //用p指向要删除的结点
		{
			pre=p;
			p=p->next;
		}
		cout<<p->data<<" ";      //输出出列的元素
		pre->next=p->next;
		free(p);
		p=pre->next;//从下一个开始循环
	}
	cout<<p->data<<" ";//输出最后一个元素
	free(p);
	return 1;
}

int main()
{
	LinkList H=Creat_LinkList();//定义一个指针变量,指向创建的单链表,并初始化
	LinkList p=H;
	int i;
	for(i=0;i<10;i++)
	{		
		Insert_LinkList(H,i);
	}
    for(i=0;i<12;i++)
	{		
		p=p->next;
		cout<<p->data;
	}
	cout<<endl;
	//cout<<Length_LinkList(H)<<endl;
    //josephus_LinkList(H,1,2);
	return 0; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值