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

来源:互联网 发布:实体渠道 数据分析 编辑:程序博客网 时间:2024/06/04 19:51


     链表是我们初学者经常接触到的数据结构,和顺序表相比,它节省了空间,在插入的时候节省了时间。

单链表每个节点由数据和指向下一个节点的指针构成。头部由一个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;}

  和测试代码相关的截图:





0 0