2023-2-6-单向循环链表-双向链表-双向循环链表--练习

1,实现双向链表按元素删除

//双向链表按元素删除
void DeleteByData(DoubleLink l,datatype e)
{
	DoubleLink p = l;
	int length = l->len;
	for(int i=0;i<length;i++){
		if(strcmp(e,p->next->data)==0){
			DoubleLink q = p->next;
			p->next = q->next;
			q->next->prev = p;
			free(q);
			q=NULL;
			l->len--;
		}
		else{
		p = p->next;
		}
	}
}

2023-2-6-单向循环链表-双向链表-双向循环链表--练习_第1张图片

2.实现循环双向链表按位置插入

//循环双向链表按位置插入
void InsertByPos(LoopDoubleLink l,int pos,datatype e)
{
	if(l==NULL||pos<1||pos>l->len+1){
		printf("按位置插入失败!\n");
		return;
	}
	LoopDoubleLink p = CreateNode();
	if(p==NULL){
		printf("按位置插入失败!\n");
		return;
	}
	p->data = e;
	LoopDoubleLink q = l;
	for(int i=0;i<pos-1;i++){
		q = q->next;
	}
	p->next = q->next;
	q->next = p;
	p->next->prev = p;
	p->prev = q;
	l->len++;
}

2023-2-6-单向循环链表-双向链表-双向循环链表--练习_第2张图片

3.实现约瑟夫环

//约瑟夫环
void YSF(LoopLink l,int n,int m)
{
	LoopLink p = l;
	printf("约瑟夫环如下:\n");
	while(l->len!=0){
		for(int i=0;i<m-1;i++){
			p = p->next;
			if(p==l)
				i--;
		}
		LoopLink q = p->next;
		if(q==l)
			q = l->next;
		printf("%d\t",q->data);
		p->next = q->next;
		free(q);
		q=NULL;
		l->len--;
	}
	printf("\n");
}

2023-2-6-单向循环链表-双向链表-双向循环链表--练习_第3张图片

4.删除链表中的所有结点
注意:调用玩删除函数后,主函数中的头指针也要指向NULL

//删除链表中所有结点
void DeleteAll(LoopLink l)
{
	//删除所有普通结点
	for(int i=0;i<l->len;i++){
		DeleteRear(l);
	}
	//主函数中:l=NULL;
	free(l);
	l=NULL;
}

5.1实现单链表的简单选择排序
5.2实现单链表的排序–有序链表

//单向链表的简单选择排序--交换值
void SimpleSort(Linklist l)
{
	char temp;
	int minpos;
	Linklist p = l;
	for(int i=0;i<l->len-1;i++){
		p = p->next;
		minpos = i;
		Linklist q = p;
		for(int j=i+1;j<l->len;j++){
			q = q->next;
			if(p->data>q->data){
				minpos = j;
			}
		}
		if(minpos!=i){
			Linklist s = p;
			for(int a=0;a<minpos-i;a++){
				s = s->next;
			}
			temp = s->data;
			s->data = p->data;
			p->data = temp;
		}

	}
}
//有序链表思想
void Sort(Linklist l){
	Linklist p = l->next;
	l->next = NULL;
	while(p){
		Linklist t = p;
		p = p->next;
		if(l->next==NULL){
			t->next = l->next;
			l->next = t;
		}
		else{
			Linklist q = l;
			while(q->next!=NULL&&q->next->data<t->data){
				q=q->next;
			}
			t->next = q->next;
			q->next = t;
		}
	}

}

2023-2-6-单向循环链表-双向链表-双向循环链表--练习_第4张图片

链表思维导图

2023-2-6-单向循环链表-双向链表-双向循环链表--练习_第5张图片

你可能感兴趣的:(数据结构,链表,数据结构)