#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 版权协议,转载请附上原文出处链接和本声明。