malloc2 double linked list

来源:互联网 发布:天刀数据随机盟会 编辑:程序博客网 时间:2024/05/16 06:03

#include<stdio.h>

#include<stdlib.h>

struct node{

  int data;

  struct node *prev;

  struct node *next;

}; 

struct node *g_head=NULL, *g_tail=NULL;

void insertData(int num){

  struct node *p=NULL, *ptr=NULL;

  ptr = g_head;

  while(ptr){

    if(ptr->data==num)

      return;

  if(ptr->data>num)

    break;

  ptr=ptr->next;

  }


 if(p = (struct node *)malloc(sizeof(sizeof(struct node))==NULL) ;

  return;

p->data = num;

p->prev =NULL;

p->next =NULL;

  if(ptr==NULL){ //1.整个list都是空的 2.insert num 是最大的n

    if(g_tail ==NULL) {// case 1

      g_head=g_tail=p;

  }

  else{

    g_tail->next=p;

    p->prev=g_tail;

    g_tail=p;

  }

}

else if(ptr==g_head){ //insert in the begining

  g_head->prev =p;

  p->next = g_head;

  g_tail =p;

}

else{ //insert p in front of ptr

  p->prev = ptr->prev;

  ptr->prev->next=p;

  ptr->prev =p;

  p->next=ptr;

}


void deleteData(int num){

  struct node *ptr=NULL;

  ptr=g_head;

  while(ptr){

    if(ptr->data==num)

      break;

    ptr=ptr->next;

  }

  //没找到

  if(ptr==NULL) 

    return;

  if(ptr==g_head && ptr==g_tail){  //only one left 

    g_head = g_tail = NULL;

    free(ptr);

    ptr =NULL;

  }


  else if(ptr==g_head){ // is the first

    g_head=g_;head->next;

    g_head->prev=NULL;

    free(ptr);

    ptr=NULL;

  }

 else if(ptr == g_tail){ //is the last

    g_tail =g_tail->prev;

    g_tail->next = NULL;

    free(ptr);

    ptr=NULL;

  }

else{ //in the middle

  ptr->prev->next = ptr->next;

  ptr->next->prev = ptr->prev;

  free(ptr);

  ptr=NULL;

  }

}


void printList(void){

  struct node *ptr=NULL;

  ptr=g_head;

  while(ptr){

    printf("%d",ptr->data);

    ptr=ptr->next;

  }

  printf("\n");

}


void freeList(void){

  struct node *ptr=NULL;

  ptr = g_head;

  while(ptr !=NULL){

    g_head = g_head->next;

    free(ptr);

   ptr=g_head;

  }

}

struct node *;

int main(void){

  return 0;

}


int main(void){

  insertData(5);

  insertData(2);

  insertData(8);

  printList();

  insertData(6);

  insertData(10);

   printList();

  deleteData(2);

  printList();

  freeList();

  return 0;

}