C++数据结构单链表

先说以下,什么是链表。我大致的按我的意思说一下,主要看各位自己的理解------------其实大多数情况下,大家是先用的动态数组,动态数组的不好处就是增添查改,需要反反复复的遍历数组,并且在内存不够的情况下,要不确定的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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值