#include "myhead.h"

struct slist *head;//链表头

//双向循环链表
struct slist
{
	int buf;//数据域
	struct slist *prev;//指向前一个
	struct slist *next;//指向后一个
};

//初始化列表
struct slist *list_init()
{
	struct slist *head=malloc(sizeof(struct slist)); 
	if(NULL==head)
	{
		printf("malloc head fail\n");
		return NULL;
	}
	head->prev=head;//指向自己
	head->next=head;
	
	return head;
}

//插入数据(尾插)
int list_insert(struct slist *head,int buf)
{	//准备新节点
	struct slist *newlist=malloc(sizeof(struct slist)); 
	newlist->buf=buf;//内容放进新节点中
	
	struct slist *p=head->prev;//找到最后一个节点
	p->next=newlist;//挂在末尾
	newlist->prev=p;
	head->prev=newlist;
	newlist->next=head;
	
}


/* 
//插入数据(插)找不到位置插入就插到末尾
int list_in(struct slist *head,char *buf,char *msg)
{	//准备新节点
	struct slist *newlist=malloc(sizeof(struct slist)); 
	strcpy(newlist->buf,msg);
	//newlist->next=head;
	struct slist *p=head;
	while(strcmp(p->buf,buf)!=0 && p->next!=head)
	{
		p=p->next;
	}
	
	p->next->prev=newlist;
	newlist->next=p->next;
	p->next=newlist;
	newlist->prev=p;
}

 */
/* 
//修改数据
int list_update(struct slist *head,char *old,char *new)
{	//
	struct slist *p=head->next; 
	while(p!=head)
	{
		if(strcmp(p->buf,old)==0)//找到要内容
		{
			printf("修改数据\n");
			strcpy(p->buf,new);
			//break;//只删除首个
		}
		p=p->next;
	}
}

 */
/* 
//删除数据
int list_remov(struct slist *head, char *buf)
{	//
	struct slist *p=head->next; 
	struct slist *q=head; 
	
	while(p!=head)
	{
		if(strcmp(p->buf,buf)==0)//找到要删除的内容
		{
			printf("删除数据%s\n",buf);
			
			p->prev->next=p->next;//q->next=p->next;
			p->next->prev=p->prev;//p->next->prev=q;
			free(p);
	
			p=q->next;
			//break;//只删除首个
			continue;
		}
		
		p=p->next;
		q=q->next;
		
	}
}

 */

//链表销毁
int list_destroy(struct slist *head)
{	//
	struct slist *p=head->next; 
	struct slist *q=head; 
	
	while(p!=head)
	{
		q->next=p->next;
		p->next->prev=q;
		free(p);
		p=q->next;
	}
	free(head);
}


//查看列表
int list_print(struct slist *head)
{
	struct slist *p=head;
	printf("%d\n",p->buf);//查看表头内容
	while(p->next!=head)
	{
		p=p->next;
		printf("%d\n",p->buf);
	}
}



int main()
{
	int i,j;
	head=list_init();//链表初始化
	
	srand(time(NULL));
	for(i=0;i<100;i++)
	{
		j=rand()%100;
		list_insert(head,j);//插入100个随机数
	}
		
	
	struct slist *p=head,*q;//q在p后面
	int temp;
	for(p=head->next; p!=head; p=p->next)
	{
		for(q=p->next; q!=head; q=q->next)
		{
			if((p->buf)%2==0)//偶数
			{
				if((q->buf)%2!=0)//保证奇数在偶数前面
				{
					temp=p->buf;
					p->buf=q->buf;
					q->buf=temp;
				}
				else if(q->buf < p->buf)//都为偶数时,小的排前面
				{
					temp=p->buf;
					p->buf=q->buf;
					q->buf=temp;
				}
			}
			else if((q->buf)%2!=0 && q->buf > p->buf)//都为奇数时,大的排前面
			{
				temp=p->buf;
				p->buf=q->buf;
				q->buf=temp;
			}
		}
	}
	
	
	//遍历
	list_print(head);
	
	list_destroy(head);//销毁链表
	return 0;
}


单向循环循环

1.特点

特点一:首尾相接

特点二:循环写法不同

while(p->next!=head)

{

}

普通双向链表

1.原理:

在普通单链表的基础上多了一个指针,该指针指向前面一个节点

struct 双向链表名字

{


//数据域

//指针域

struct 双向链表名字 *prev;  //指向前面一个节点的指针

struct 双向链表名字 *next;  //指向后面一个节点的指针

};


双向循环链表

1.特点

特点一:首尾相接

最后一个节点next指针指向头节点

头节点的prev指针指向最后一个节点

特点二:循环写法不同

while(p->next!=head)

{

}



版权声明:本文为m0_59014066原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_59014066/article/details/119703097