双向链表的基本操作回顾(代码)

头文件:

#ifndef DOUBLELINKLIST_H
#define DOUBLELINKLIST_H

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

//链表结点
typedef struct _DOUBLELISTNODE
{
void* data;
struct _DOUBLELISTNODE* next;
struct _DOUBLELISTNODE* prev;

}DoubleListNode;


//头节点
typedef struct _DOUBLELINKLIST
{
DoubleListNode* head;
DoubleListNode* rear;
int lenth;
}DoubleLinkList;

//打印回调函数
typedef void(*PrintfDoubleLinkNode)(DoubleListNode*);


//打印链表
void PrintDoubleListLink(DoubleLinkList*dlist, PrintfDoubleLinkNode print );

 

//双向链表初始化:
DoubleLinkList* InitDoubleLinkList();

//插入节点
int InsertDoubleLinkList(DoubleLinkList*dlist, int pos, void* data);

//销毁双向链表
void DestoryDoubleLinkList(DoubleLinkList*dlist);

//获得链表的长度
int GetLengthDoubleLinkList(DoubleLinkList*dlist);


#endif

 

 

 

CPP文件:

#include "DoubleLinkList.h"


void PrintfDoubleLinkNode_s(DoubleListNode* node)
{
printf("data=%s\n", node->data);
}


//打印链表
void PrintDoubleListLink(DoubleLinkList*dlist, PrintfDoubleLinkNode printnode)
{
if (dlist == NULL )
{
printf("argument err\n");
}
DoubleListNode*current = dlist->head;
while (current != NULL)
{
printf("data=%s\n", current->data);
current = current->next;

}

}


//双向链表初始化:
DoubleLinkList* InitDoubleLinkList()
{
DoubleLinkList* dlist = (DoubleLinkList*)malloc(sizeof(DoubleLinkList));
if (dlist == NULL)
{
printf("malloc err\n");
return NULL;
}
dlist->lenth = 0;
dlist->head= NULL;
dlist->rear = NULL;
return dlist;
}


//插入节点
int InsertDoubleLinkList(DoubleLinkList*dlist, int pos, void* data)
{
if (dlist == NULL )
{
printf("insert argument err\n");
return -1;
}
int i;
//每一个结点都要malloc空间
DoubleListNode*newnode = (DoubleListNode*)malloc(sizeof(DoubleListNode));
newnode->data = data;
newnode->next = NULL;
newnode->prev = NULL;


//分情况,第一次头插入,DoubleListList类型,后面头插入用DoubleListNode,尾插法又不一样
//第一次插入或者插入到链表结尾
if (dlist->head==NULL&&dlist->rear==NULL)
{
dlist->rear = newnode;
dlist->head = newnode;

dlist->head->next = NULL;
dlist->head->prev = NULL;

dlist->rear->next = NULL;
dlist->head->prev = NULL;

dlist->lenth++;
return 0;
}
//头插
if (pos < 0)
{
newnode->next = dlist->head;
dlist->rear->prev = newnode;
dlist->head = newnode;

dlist->lenth++;
return 0;
}
//尾插
if (pos>dlist->lenth)
{
dlist->rear->next = newnode;
newnode->next = NULL;
newnode->prev = dlist->rear;

dlist->rear = newnode;
dlist->lenth++;
}
//其他按照位置插入
DoubleListNode *ptr = dlist->head;
DoubleListNode *next = ptr->next;
for (i = 0; i < pos-1; i++)
{
next = ptr;
ptr = next->next;
}

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

dlist->lenth += 1;
return 0;
}

//获得链表的长度
int GetLengthDoubleLinkList(DoubleLinkList*dlist)
{
return dlist->lenth;
}
//销毁双向链表
void DestoryDoubleLinkList(DoubleLinkList*dlist)
{
//dlist
DoubleListNode*p = dlist->head;
while (p != dlist->rear)
{
p = p->next;
free(p->prev);
}
free(dlist->rear);
free(dlist);
//return NULL;

}


int main(void)
{
DoubleLinkList* Head = InitDoubleLinkList();
char data[] = { "hello" };
int length;
InsertDoubleLinkList(Head, 1, data);

char data1[] = { "world!" };
InsertDoubleLinkList(Head, -1, data1);
printf("%s\n length=%d\n", Head->head->data,Head->lenth);

char data2[] = { " hello world!" };
InsertDoubleLinkList(Head, 1, data2);
printf("%s\n length=%d\n", Head->head->data, Head->lenth);


length = GetLengthDoubleLinkList(Head);
printf("the list length is %d\n", length);


PrintDoubleListLink(Head, &PrintfDoubleLinkNode_s);
DestoryDoubleLinkList(Head);


system("pause");
return 0;
}

 

posted on 2016-08-06 20:22  A-祥子  阅读(246)  评论(0)    收藏  举报

导航