您的位置:首页 > 其它

关于循环双向链表

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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: