双向链表的操作实现(c语言)

来源:互联网 发布:tplink 校招 知乎 编辑:程序博客网 时间:2024/05/01 00:17

1.list.h

# ifndef _LIST_H
# define _LIST_H

typedef struct node
{
 void * data;
 struct node * pior;
 struct node * next;
}NODE;

typedef struct
{
 NODE * head;
 NODE * last;
 int length;
}LIST;

LIST * InitList();
int InsertList(LIST * l, void * data, int size);
int DeleteNode(LIST * l, int index);
void PrintList(LIST * l, int page, int preP, void (*printNode)(void *));
void ClearList(LIST * l);
void DestroyList(LIST ** l);

# endif

 

2.list.c

# include "list.h"
# include <string.h>
# include <stdio.h>
# include <stdlib.h>

LIST * InitList()
{
 LIST * l = (LIST *)malloc(sizeof(LIST));
 if(NULL == l)
  exit(-1);
 l->head = (NODE *)malloc(sizeof(NODE));
 if(NULL == l->head)
  exit(-1);
 memset(l->head, 0, sizeof(NODE));

 l->last = (NODE *)malloc(sizeof(NODE));
 if(NULL == l->last)
  exit(-1);
 memset(l->last, 0, sizeof(NODE));

 l->head->next = l->last;
 l->last->pior = l->head;
 l->length = 0;

 return l;
}

int InsertList(LIST * l, void * data, int size)
{
 NODE * n = NULL;

 if(NULL==l || NULL==data || size<=0)
  return 0;
 n = (NODE *)malloc(sizeof(NODE));
 if(NULL == n)
  return 0;
 n->data = malloc(sizeof(size));
 if(NULL == n->data)
 {
  free(n);
  return 0;
 }

 memcpy(n->data, data, size);
 n->next = l->last;
 n->pior = l->last->pior;

 l->last->pior->next = n;
 l->last->pior = n;
 l->length++;

 return 1;
}

int DeleteNode(LIST * l, int index)
{
 int i;
 NODE * p = NULL;

 if(NULL == l || index < 1 || index > l->length)
 return 0;

 p = l->head->next;
 while(i<l->length)
 {
  i++;
  if(i == index)
   break;
  p = p->next;
 }
 p->pior->next = p->next;
 p->next->pior = p->pior;

 free(p->data);
 free(p);
 l->length--;

 return 1;
}

void PrintList(LIST * l, int page, int preP, void (*printNode)(void *))
{
 int start, end;
 NODE * p = NULL;
 if(NULL == l || printNode == NULL)
  return;
 start = (page-1) *preP + 1;
 end  = page * preP;

 int i = 0;
 p = l->head->next;

 while(i<l->length && p->next != NULL)
 {
  ++i;
  if(i == start)
   break;
  p = p->next;
 }
 for(; i<=end && p->next != NULL; i++)
 {
  printNode(p->data);
  p = p->next;
 }
}

void ClearList(LIST * l)
{
 if(NULL == l)
  return;
 while(l->length)
  DeleteNode(l, 1);
}

void DestroyList(LIST ** l)
{
 LIST *p = *l;
 if(NULL == p) return;
 ClearList(p);
 free(p->head);
 free(p->last);
 free(p);
 *l = NULL;
}

 

3.main.c

# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include "list.h"

int arr[5] = {12, 18, 45, 9, 10};

void PrintData(void * data)
{
 int * i = (int *)data;
 printf("i = %d\n", *i);
}

void main()
{
 int i;
 LIST * list = InitList();
 for(i=0; i<5; ++i)
  InsertList(list, &arr[i], sizeof(arr[i]));
 PrintList(list, 1, 3, PrintData);

 DestroyList(&list);
 if(list == NULL)
  printf("list is null\n");
 else
  printf("list is not null\n");
}

 

原创粉丝点击