【C语言】 单链表的实现 用malloc实现的动态内存管理
2016-03-30 15:36
405 查看
链表是我们初学者经常接触到的数据结构,和顺序表相比,它节省了空间,在插入的时候节省了时间。
单链表每个节点由数据和指向下一个节点的指针构成。头部由一个head节点,尾部指针指向NULL。
如图所示:
而用malloc实现,就是需要插入一个节点的时候在开辟空间存放此节点。
代码实现如下:
头文件.h:
cpp文件:
部分测试代码:
和测试代码相关的截图:
单链表每个节点由数据和指向下一个节点的指针构成。头部由一个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; }
和测试代码相关的截图:
相关文章推荐
- 【poj 1080】Human Gene Functions 题意&题解&代码(C++)
- xc与c语言的区别
- C++多线程编程简单实例
- 共有24款C/C++ 地理信息系统GIS开源软件
- C++ 创建一系列字符串
- c++ 循环创建不同名的txt
- C++ for循环执行顺序
- C/C++异常处理
- stl::string与二进制数据
- BM算法的C++实现
- C++实现string存取二进制数据的方法
- C语言温习
- C/C++异常处理机制
- 关于c语言中二维数组的思考
- C++中的容器类
- Boyer-Moore算法的C++实现
- 【poj 3176】Cow Bowling 题意&题解&代码(C++)
- VC++6.0 在win7 64中的安装
- C++ 构造函数中调用虚函数
- C++之pair