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;
}
在.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;
}
相关文章推荐
- 删除一个有序链表的重复元素
- 数据结构之栈(3)——链栈
- 数据结构之栈(2)——多栈共享技术
- 数据结构之顺序表的实现
- 数据结构之栈(1)——顺序栈
- java实现AVL树(一种自平衡二叉树)数据结构
- 数据结构之栈(0)——栈概览
- 数据结构--二叉树(1)
- 数据结构(主席树):COGS 2211. 谈笑风生
- java实现图(无向图)数据结构
- java实现栈数据结构
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构之线性表(C#)
- 数据结构-java与c实现带头结点的单链表
- 用栈+回溯+非递归解决N皇后问题
- 通俗地介绍下---数据结构之堆
- OVS端口模块的重要数据结构3
- 数据结构实现循环队列的两种方法
- 关于链表、树等数据结构中常见的二级指针
- 【数据结构与算法】十六