您的位置:首页 > 运维架构 > Linux

Linux下的C语言编程——双向循环链表的简单实现

2016-11-06 22:02 381 查看
下面我先贴上我的代码

#include <stdio.h>
#include <stdlib.h>

struct node
{
int num;
struct node *next,*prior;
};

typedef struct node Dbnode;
typedef struct node *Dblink;

void creat_link(Dblink *head) //创建链表
{
*head = (Dblink)malloc(sizeof(Dbnode));

if(!(*head))
{
printf("malloc error!\n");
exit(-1);
}

(*head)->next = (*head)->prior = *head;//让头节点的前驱和后继都指向自己形成一个环
}

void creat_node(Dblink *newnode) //生成节点
{
*newnode = (Dblink)malloc(sizeof(Dbnode));

if(!(*newnode))
{
printf("malloc error!\n");
exit(-1);
}
}

void insert_head(Dblink *head,Dblink newnode)//头插法实现创建链表
{
newnode->next = (*head)->next;
newnode->prior = *head;
(*head)->next->prior = newnode;
(*head)->next = newnode;

if((*head)->prior == *head)
{
(*head)->prior = newnode;
}
}

void insert_tail(Dblink *head,Dblink newnode)//尾插法
{
Dblink temp = *head;

while(temp->next != *head)
{
temp = temp->next;
}

newnode->prior = temp;
newnode->next = temp->next;
temp->next = newnode;
(*head)->prior = newnode;
}

void display(Dblink head)//遍历链表
{
Dblink temp = head->next;

if((head)->next == head)
{
printf("empty!\n");
return ;
}
else
{
while(temp != head)
{
printf("sum = %d\n",temp->num);
temp = temp->next;
}
}
}

void delete_node(Dblink *head, int num)//删除节点
{
Dblink temp;
temp = (*head)->next;

while(temp->num != num && temp->next != *head)
{
temp = temp->next;
}

if(temp->num == num)
{
temp->prior->next = temp->next;
temp->next->prior = temp->prior;
free(temp);
}
else
{
printf("no such number!\n");
return;
}
}

void clear(Dblink *head)// 将链表置空
{
Dblink temp = (*head)->next;
Dblink p = *head;

if((*head)->next == *head)
{
printf("empty!\n");
return ;
}
else
{
while(temp != *head)
{
(*head)->next = temp->next;
free(temp);
temp = (*head)->next;
}
printf("success!\n");
}
}

void insert_mid(Dblink *head,Dblink newnode,int num)//中间插入从小到小插入
{
Dblink temp = (*head)->next;

if((*head)->next == *head)
{
newnode->prior = (*head);
newnode->next = *head;
(*head)->next = newnode;
(*head)->prior = newnode;
}
else
{
while(temp->num < num && temp->next != *head)
{
temp = temp->next;
}

if(temp->next != *head)
{
newnode->prior = temp->prior;
newnode->next = temp;
temp->prior->next = newnode;
temp->prior = newnode;
}
else
{
if(num > temp->num)
{
newnode->next = *head;
newnode->prior = temp;
(*head)->prior = newnode;
temp->next = newnode;
}
else
{
newnode->prior = temp->prior;
newnode->next = temp;
temp->prior->next = newnode;
temp->prior = newnode;
}
}
}
}

int main()//主函数
{
Dblink head;
Dblink newnode;

int i;
int num;

creat_link(&head);			//下面就是挨个测试函数,有些函数先注释掉,用到时候再用

/*	for(i = 0; i < 10; i++)
{
creat_node(&newnode);
newnode->num = i;
//	insert_head(&head,newnode);
insert_tail(&head,newnode);
}*/

//	display(head);

/*	printf("input a integer!\n");
scanf("%d",&num);

delete_node(&head,num);*/

//	clear(&head);

for(i = 0; i < 10; i++)
{
creat_node(&newnode);
scanf("%d",&num);
newnode->num = num;
insert_mid(&head,newnode,newnode->num);
}

display(head);

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