关于循环双向链表
2012-04-15 13:20
155 查看
typedef struct node
{
int data;
struct node *pre;
struct node *next;
}node,*link;
link createlink()//创建链表
{
int input;
link head,list,cur ;
head=(link)malloc(sizeof(node));//申请头结点空间
if(head==NULL)
{
printf("malloc error\n");
exit(0);
}
//初始化头结点
head->next=NULL;
head->pre=NULL;
list=head;//head先申请空间,在赋值,否则无效
printf("please input data(end with 0):\n");
scanf("%d",&input);
while(input!=0)
{
cur=(link)malloc(sizeof(node));
if(cur==NULL)
{
printf("malloc error\n");
exit(0);
}
cur->data=input;
list->next=cur;
cur->pre=list;
list=cur;
scanf("%d",&input);
}
//尾节点的后继指向头结点,头结点的前驱指向尾节点,构成双向循环链表
cur->next=head;
head->pre=cur;
return head;
}
void printlink(link head)//打印链表
{
link list;
list=head->next;
while(list!=head)
{
printf("%d ",list->data);
list=list->next;
}
printf("\n");
}
link insertlink(link head)//插入新的节点
{
link list=head,cur;
int input;
printf("please input what you want to insert:\n");
scanf("%d",&input);
cur=(link)malloc(sizeof(node));//申请节点空间
if(cur==NULL)
{
printf("malloc error\n");
exit(0);
}
//头插法,让先来的节点有所指向
cur->data=input;
cur->next=list->next;
cur->pre=list;
list->next=cur;
cur->next->pre=cur;
return head;
}
link searchlink(link head)//查询指定节点,查询到第一个符合条件的节点,便返回该节点的指针
{
link list;
int search;
printf("please input what you want to search:\n");
scanf("%d",&search);
list=head->next;
while(list!=head)
{
if(list->data==search)
{
return list;
//i++;
//printf("第%d个 %d\n",i,list->data);
}
list=list->next;
}
return NULL;
}
link deletelink(link head,link pfind)//删除节点
{
if(pfind!=NULL)
{//pfind的前驱的后继指向pfind的后继,pfind的后继的前驱指向pfind的前驱,释放指针
pfind->pre->next=pfind->next;
pfind->next->pre=pfind->pre;
free(pfind);
}
else
{
printf("delete none\n");
return head;
}
return head;
}
int lenlink(link head)//计算链表长度
{
int len=0 ;
link list;
list=head->next;
while(list!=head)
{
len++;
list=list->next;
}
return len;
}
link poplink(link head,int len)//冒泡排序,每次都是次都是从首节点开始
{
link p,q,list,temp;//list指向头结点的指针
int i,j;
list=head;
for(i=0;i<len-1;i++)
{
p=list->next;
q=p->next;
for(j=0;j<len-i-1;j++)
{
if(p->data>q->data)
{
p->pre->next=q;
q->pre=p->pre;
p->pre=q;
p->next=q->next;
q->next=p;
p->next->pre=p;
// 交换节点结束后,交换执政,保持先序
temp=p;
p=q;
q=temp;
}
p=p->next;
q=q->next;
}
}
return head;
}
void destorylink(link head)
{
head->pre->next=NULL;//尾节点的后继置为NULL
link p;//存放将要销毁的节点指针,头结点后移
while(head!=NULL)
{
p=head;
head=head->next;
free(p);
}
}
{
int data;
struct node *pre;
struct node *next;
}node,*link;
link createlink()//创建链表
{
int input;
link head,list,cur ;
head=(link)malloc(sizeof(node));//申请头结点空间
if(head==NULL)
{
printf("malloc error\n");
exit(0);
}
//初始化头结点
head->next=NULL;
head->pre=NULL;
list=head;//head先申请空间,在赋值,否则无效
printf("please input data(end with 0):\n");
scanf("%d",&input);
while(input!=0)
{
cur=(link)malloc(sizeof(node));
if(cur==NULL)
{
printf("malloc error\n");
exit(0);
}
cur->data=input;
list->next=cur;
cur->pre=list;
list=cur;
scanf("%d",&input);
}
//尾节点的后继指向头结点,头结点的前驱指向尾节点,构成双向循环链表
cur->next=head;
head->pre=cur;
return head;
}
void printlink(link head)//打印链表
{
link list;
list=head->next;
while(list!=head)
{
printf("%d ",list->data);
list=list->next;
}
printf("\n");
}
link insertlink(link head)//插入新的节点
{
link list=head,cur;
int input;
printf("please input what you want to insert:\n");
scanf("%d",&input);
cur=(link)malloc(sizeof(node));//申请节点空间
if(cur==NULL)
{
printf("malloc error\n");
exit(0);
}
//头插法,让先来的节点有所指向
cur->data=input;
cur->next=list->next;
cur->pre=list;
list->next=cur;
cur->next->pre=cur;
return head;
}
link searchlink(link head)//查询指定节点,查询到第一个符合条件的节点,便返回该节点的指针
{
link list;
int search;
printf("please input what you want to search:\n");
scanf("%d",&search);
list=head->next;
while(list!=head)
{
if(list->data==search)
{
return list;
//i++;
//printf("第%d个 %d\n",i,list->data);
}
list=list->next;
}
return NULL;
}
link deletelink(link head,link pfind)//删除节点
{
if(pfind!=NULL)
{//pfind的前驱的后继指向pfind的后继,pfind的后继的前驱指向pfind的前驱,释放指针
pfind->pre->next=pfind->next;
pfind->next->pre=pfind->pre;
free(pfind);
}
else
{
printf("delete none\n");
return head;
}
return head;
}
int lenlink(link head)//计算链表长度
{
int len=0 ;
link list;
list=head->next;
while(list!=head)
{
len++;
list=list->next;
}
return len;
}
link poplink(link head,int len)//冒泡排序,每次都是次都是从首节点开始
{
link p,q,list,temp;//list指向头结点的指针
int i,j;
list=head;
for(i=0;i<len-1;i++)
{
p=list->next;
q=p->next;
for(j=0;j<len-i-1;j++)
{
if(p->data>q->data)
{
p->pre->next=q;
q->pre=p->pre;
p->pre=q;
p->next=q->next;
q->next=p;
p->next->pre=p;
// 交换节点结束后,交换执政,保持先序
temp=p;
p=q;
q=temp;
}
p=p->next;
q=q->next;
}
}
return head;
}
void destorylink(link head)
{
head->pre->next=NULL;//尾节点的后继置为NULL
link p;//存放将要销毁的节点指针,头结点后移
while(head!=NULL)
{
p=head;
head=head->next;
free(p);
}
}
相关文章推荐
- 关于可控大小的双向循环链表
- 关于双向循环链表基本操作
- 关于 双向循环链表 的一些基础程序
- 数据结构:带头结点的双向循环链表
- 线性表和带头结点的双向循环链表
- 数据结构-----双向循环链表
- 双向循环链表基本操作
- java 双向循环链表
- 双向循环链表
- 双向非循环递增链表——插入,删除,清空
- "《算法导论》之‘线性表’":双向循环链表
- java双向循环链表的实现代码
- Linux中的双向循环链表
- 双向循环链表
- 创建一个双向链表或双向循环链表
- 2016年12月23日学习总结----双向循环链表操作程序(头插、尾插、中间插入、删除)
- (学习java)双向循环链表
- 修改自linux内核的双向循环链表通用算法
- 数据结构基础(12) --双向循环链表的设计与实现
- 带头节点的双向循环链表的增删查改