双向链表
环境:gcc
目的:双向链表练习
功能如下:
1. 创建一个双向链表
2. 在双向链表中插入一个元素
3. 在双向链表中删除一个元素
/*************************************************************************
@Author: wanghao
@Created Time : Wed 09 May 2018 07:13:26 PMPDT
@File Name: doulinklist.c
@Description:
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
typedef int data_t;
typedef struct node_t
{
data_tdata;
structnode_t *prior;
structnode_t *pnext;
}Node;
Node *create_doulist_node(void)
{
Node*pnode = NULL;
pnode= (Node *)malloc(sizeof(Node));
if(pnode== NULL)
{
printf("Mallocnew double list node fail!\n");
returnNULL;
}
pnode->data= 0;
pnode->prior= NULL;
pnode->pnext= NULL;
returnpnode;
}
Node *Insert_doulinklist_node_tail(Node*phead, data_t data)
{
Node*p;
Node*newnode = NULL;
if(phead== NULL)
{
printf("Thedouble linklist does not exist!\n");
returnNULL;
}
newnode= create_doulist_node();
if(newnode== NULL)
{
printf("Createnew node fail!\n");
returnNULL;
}
newnode->data= data;
p= phead;
while(p->pnext)
{
p= p->pnext;
}
newnode->pnext= p->pnext;
newnode->prior= p;
p->pnext= newnode;
returnp;
}
Node *Insert_doulinklist_node(Node *phead,int location, data_t data)
{
inti = 1;
Node*p;
Node*newnode = NULL;
if(phead== NULL)
{
printf("Thedouble linklist does not exist!\n");
returnNULL;
}
newnode= create_doulist_node();
if(newnode== NULL)
{
printf("Createfail!\n");
returnNULL;
}
newnode->data= data;
p= phead;
while((i<= location) && (p->pnext))
{
i++;
p= p->pnext;
}
if((i> location) && (p->pnext == NULL))
{
printf("Donot find the node location!\n");
returnNULL;
}
/*Insertdoulinklist node in tail*/
if(p->pnext== NULL)
{
newnode->pnext= p->pnext;
newnode->prior= p;
p->pnext= newnode;
}
else
{
/*Baseon P's previous node*/
p= p->prior;
newnode->pnext= p->pnext;
newnode->prior= p;
p->pnext->prior= newnode;
p->pnext= newnode;
}
returnphead;
}
Node *delete_doulinklist_node(Node *phead,int location,data_t *data)
{
inti = 1;
Node*p;
if(phead== NULL)
{
printf("Thedouble linklist does not exist!\n");
returnNULL;
}
p= phead;
while((i<= location) && (p->pnext))
{
i++;
p= p->pnext;
}
if((i> location) && (p == NULL))
{
printf("Donot find the node!\n");
returnNULL;
}
/*Deletedoulinklist node in tail*/
if(p->pnext== NULL)
{
p->prior->pnext= p->pnext;
}
else
{
p->prior->pnext= p->pnext;
p->pnext->prior= p->prior;
}
*data= p->data;
free(p);
p= NULL;
returnphead;
}
int print_doulinklist(Node *phead)
{
Node*node = NULL;
if(phead== NULL)
{
printf("Thedouble link list does not exist!\n");
return-1;
}
node= phead;
while(node->pnext)
{
printf("%d\t",node->pnext->data);
node= node->pnext;
}
printf("\n");
return0;
}
int main(int argc, const char *argv[])
{
data_tdata;
Node*phead = NULL;
phead= create_doulist_node();
if(!phead)
{
printf("Createdouble link list fail\n");
return1;
}
Insert_doulinklist_node_tail(phead,1);
Insert_doulinklist_node_tail(phead,2);
print_doulinklist(phead);
Insert_doulinklist_node(phead,3, 3);
Insert_doulinklist_node(phead,4, 4);
Insert_doulinklist_node(phead,5, 5);
Insert_doulinklist_node(phead,6, 6);
print_doulinklist(phead);
Insert_doulinklist_node(phead,1, 7);
print_doulinklist(phead);
delete_doulinklist_node(phead,7, &data);
printf("Deletedata is %d\n",data);
print_doulinklist(phead);
delete_doulinklist_node(phead,3, &data);
printf("Deletedata is %d\n",data);
print_doulinklist(phead);
return0;
}