双向链表

环境: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;

}