您的位置:首页 > 理论基础 > 数据结构算法

C++数据结构单链表

2016-04-05 23:56 441 查看
先说以下,什么是链表。我大致的按我的意思说一下,主要看各位自己的理解------------其实大多数情况下,大家是先用的动态数组,动态数组的不好处就是增添查改,需要反反复复的遍历数组,并且在内存不够的情况下,要不确定的malloc,造成很多不好的问题。链表和数组一样,可以存储一直想要push的数据,好处依据链表的特性,它是由一个个的节点构成的,每一个节点里面包含了上一个节点的地址和下一个节点的地址,还有我们想要保存的数据组成。那么,我们只需要地址,就可以取出我们相应的数据。

在.h页面开始定义
定义了两个结构体,分别存节点、list头尾数目

#ifndef __LIST_H__
#define __LIST_H__
#include "typedef.h"

/**
*@prev上一个节点
*@next下一个节点
*@data每个节点里的数据
typedef struct  Node {

Node* prev;

Node* next;

void* data;
}Node;

/**
*@begin开始的节点
*@end结束的节点
*@sizelist里面的总数也就是节点的总数
*/
typedef struct List {

Node* begin;

Node* end;

int size;
}List;

my_extern void initList(List* mlist);// 初始化list

my_extern void listRelease(List* list);//释放list

my_extern void ListPushBack(List* list, void* data);//在尾部push data进去,注意新建节点

my_extern void ListPushFront(List* list, void* data);// 在头部push data进去,注意新建节点

my_extern void ListInsert(List* list, int index);//在list中插入节点

my_extern void ListPopBack(List* list);//删除尾部节点

my_extern void ListPopFront(List* list);//删除头部节点

my_extern void ListDeleteN(List* list, int index,void* data);//删除指点节点
#endif

                       //以上是.h文件的定义部分
              //以下是.cpp或者.c部分(C语言也可以)

#include "List.h"

#include "stdafx.h"

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

void initList(List* mlist){  
//初始化

mlist->size = 0;

mlist->begin = NULL;

mlist->end = NULL;
}

void ListPushBack(List* list, void* data){//在尾部push data进去,注意新建节点

Node *p;

p = (Node*)malloc(sizeof(Node));

int i = list->size;

if (i == 0)

{

list->begin = p;

p->prev = NULL;

p->data = data;

list->end = p;

}

else

{

list->end->next = p;

p->prev = list->end;

list->end = p;

p->data = data;

}

list->size += 1;

p->next = NULL;
}
void ListPushFront(List* list, void* data){// 在头部push data进去,注意新建节点

Node *p;

p = (Node*)malloc(sizeof(Node));

int i = list->size;

int j = 0;

if (i == 0)

{

list->begin = p;

p->prev = NULL;

p->data = data;

list->end = p;

p->next = NULL;

}

else

{

p->prev = NULL;

p->next = list->begin;

p->data = data;

list->begin = p;

}

list->size += 1;
}

void ListInsert(List* list, int index, void* data){//在list中插入节点

Node* p;

Node* p2;

if (index < 0||index>list->size)

{

return;

}

else

{

if (index == 0)

{

ListPushFront(list, data);

return;

}

else if (index == list->size)

{

ListPushBack(list, data);

return;

}

p = list->begin;

do{

p = p->next;

} while (--index);

p2 = (Node*)malloc(sizeof(Node));

p2->next = p;

p2->prev = p->prev;

p->prev->next = p2;

p->prev = p2;

p2->data = data;

}

list->size += 1;

return;
}
void ListPopBack(List* list){//删除尾部节点

Node* p;

Node* p1;

if (list->begin == NULL)

{

return;

}

p = list->end;

if (list->size == 1)

{

list->begin = NULL;

list->end = NULL;

}

else

{

p1 = p->prev;

list->end = p1;

p1->next = NULL;

}

free(p);

list->size -= 1;

return;
}
void ListPopFront(List* list){//删除头部节点

Node* p;

Node* p1;

p = list->begin;

if (list->begin == NULL)

{

return;

}

if (list->size == 1)

{

list->begin= NULL;

list->end = NULL;

}

else

{

p1 = p->next;

list->begin = p1;

p1->prev = NULL;

}

list->size -= 1;

free(p);

return;
}
void ListDeleteN(List* list, int index){//删除指定的某一个节点

Node* p;

Node* p1;

int j = 0;

p = list->begin;

if (index<0 || index>list->size)

{

return;

}

else

{

if (index == 0)

{

ListPopFront(list);

return;

}

else if (index == list->end)

{

ListPopBack(list);

return;

}

do{

p = p->next;

} while (--index);

p1 = p;

p1->prev->next = p1->next;

p1->next->prev = p1->prev;

}

free(p);

list->size -= 1;

return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: