您的位置:首页 > 编程语言 > C语言/C++

【C语言】 单链表的实现 用malloc实现的动态内存管理

2016-03-30 15:36 405 查看
链表是我们初学者经常接触到的数据结构,和顺序表相比,它节省了空间,在插入的时候节省了时间。

单链表每个节点由数据和指向下一个节点的指针构成。头部由一个head节点,尾部指针指向NULL。

如图所示:

而用malloc实现,就是需要插入一个节点的时候在开辟空间存放此节点。

代码实现如下:

头文件.h:

#pragma once
#define __SEQ_LIST__
#ifdef __SEQ_LIST__

#include <stdio.h>
#include<malloc.h>
#include<assert.h>

typedef int DateType;
typedef struct Node
{
DateType date;
struct Node* next;
}Node, *PLinkList;

void InitList(PLinkList* pplist);//初始化
void PrintList(PLinkList list);//打印
int GetLength(PLinkList list);//数据存入长度

void PushBack(PLinkList* ppList, DateType x);//尾插
void PushFront(PLinkList* ppList, DateType x);//头插
void PopBack(PLinkList* ppList);
void PopFront(PLinkList* ppList);

Node* Find(PLinkList pList, DateType x);
void Insert(PLinkList* ppList, Node* n, DateType x);
int Remove(PLinkList* ppList, DateType x);
void Erase(PLinkList* ppList, Node* n);

#endif;


cpp文件:

#include "LIST.h"

PLinkList CreateNode(DateType x)//开辟空间
{
PLinkList tmp = (PLinkList)malloc(sizeof(Node));
tmp->date = x;
tmp->next = NULL;
return tmp;
}

void InitList(PLinkList* pplist)
{
assert(pplist);
*pplist = 0;
}

void PrintList(PLinkList list)//打印
{
PLinkList begin = list;
while (begin != NULL)
{
printf("%d ", begin->date);
begin = begin->next;
}
}

int GetLength(PLinkList list)//数据存入长度
{
int count = 0;
PLinkList begin = list;
while (begin != NULL)
{
count++;
begin = begin->next;
}
return count;
}

void PushBack(PLinkList* ppList, DateType x)//尾插
{
assert(ppList);
if (*ppList == NULL)
{
*ppList = CreateNode(x);
}
else
{
PLinkList begin = *ppList;
PLinkList tmp = CreateNode(x);
begin->next = tmp;//******..
tmp->next = NULL;
}
}

void PushFront(PLinkList* ppList, DateType x)//头插
{
if (*ppList == NULL)
{
*ppList = CreateNode(x);
}
else
{
PLinkList tmp = CreateNode(x);
tmp->next = *ppList;
*ppList = tmp;
}
}

void PopBack(PLinkList* ppList)
{
PLinkList end, pre;
assert(ppList);
end = *ppList;
if (*ppList == NULL)
{
printf("List is NULL");
}
else
{
while (end->next != NULL)
{
pre = end;
end = end->next;
}
free(end);
end->next = NULL;
}
}

void PopFront(PLinkList* ppList)
{
assert(ppList);
if (*ppList == NULL)
{
printf("List is NULL");
}

else
{
PLinkList tmp = *ppList;
*ppList = (*ppList)->next;
free(tmp);
}
}

Node* Find(PLinkList pList, DateType x)
{
Node* tmp;
PLinkList P = pList;
while (P->next != NULL)
{
if (P->date == x)
{
tmp = (Node*)P->date;
printf("%d\n", P->date);
return tmp;
}
else
{
return -1;
}
}
}


部分测试代码:

int main()
{
PLinkList s;
InitList(&s);
PushBack(&s, 6);
PushFront(&s, 7);
PushFront(&s, 1);
PopFront(&s);

GetLength(s);
printf("Length: %d\n", GetLength(s));
Find(s, 7);
PrintList(s);

getchar();
return 0;
}


和测试代码相关的截图:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: