用C语言实现单项链表
2016-05-21 17:26
831 查看
用C语言在VS开发工具下写了个单项链表,在此贴出代码,互相学习:
本单项链表由3个文件文件构成,分别为链表头文件LinkList.h 、链表文件 LinkList.c 、测试用例文件main.c
LinkList.h源码:
LinkList.c源码:
main.c源码:
本单项链表由3个文件文件构成,分别为链表头文件LinkList.h 、链表文件 LinkList.c 、测试用例文件main.c
LinkList.h源码:
#ifndef LINKLIST_H #define LINKLIST_H #include <stdlib.h> #include <stdio.h> #include <memory.h> //链表结点 typedef struct LINKNODE { void* data;//指向任何类型的数据 struct LINKNODE* next; }LinkNode; //链表结构体 typedef struct LINKLIST { LinkNode head; int size; }LinkList; //打印函数指针 typedef void(*PRINTLINKLIST)(void*); //初始化链表 LinkList* Init_LinkList(); //指定位置插入 void Insert_LinkList(LinkList* list, int pos, void* data); //删除指定位置的值 void RemoveByPos_LinkList(LinkList* list, int pos); //获得链表的长度 int Size_LinkList(LinkList* list); //查找 int Find_LinkList(LinkList* list, void* data); //返回第一个结点 void* Front_LinkList(LinkList* list); //打印链表结点 void Print_LinkList(LinkList* list, PRINTLINKLIST print); //释放链表内存 void FreeSpace_LinkList(LinkList* list); #endif
LinkList.c源码:
#include "LinkList.h" //初始化链表 LinkList* Init_LinkList() { LinkList* list = (LinkList*)malloc(sizeof(LinkList)); //头结点 是不保存数据信息 list->head.data = NULL; list->head.next = NULL; list->size = 0; return list; } //指定位置插入节点 void Insert_LinkList(LinkList* list, int pos, void* data) { if (list == NULL || data == NULL) { return; } //友好的处理,pos越界 if (pos < 0 || pos >list->size) { pos = list->size; } //找结点 //辅助指针变量 LinkNode* pCurrent = &(list->head); int i = 0; while (i < pos) { pCurrent = pCurrent->next; i++; } //创建新的结点 LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode)); newNode->data = data; //新结点入链表 newNode->next = pCurrent->next; pCurrent->next = newNode; list->size++; } //删除指定位置的节点 void Remove_LinkList(LinkList* list, int pos) { if (list == NULL) { return; } if (pos < 0 || pos >= list->size) { return; } //查找删除结点的前一个结点 LinkNode* pCurrent = &(list->head); int i = 0; while (i < pos) { pCurrent = pCurrent->next; i++; } //缓存删除的结点 LinkNode* delNode = pCurrent->next; pCurrent->next = delNode->next; //释放删除结点的内存 if (delNode != NULL) { free(delNode); } list->size--; } //获得链表的长度 int Size_LinkList(LinkList* list) { if (list == NULL) { return -1; } return list->size; } //查找节点位置 int Find_LinkList(LinkList* list, void* data) { if (list == NULL || data == NULL) { return -1; } //遍历查找 LinkNode* pCurrent = &(list->head); int pos = -1; int i = 0; while (pCurrent->next != NULL) { pCurrent = pCurrent-& 4000 gt;next; if (memcmp(pCurrent->data, data, sizeof(data)) == 0) { pos = i; break; } i++; } return pos; } //返回第一个结点数据 void* Front_LinkList(LinkList* list) { if (list == NULL) { return NULL; } return list->head.next->data; } //通过回调函数打印链表结点 void Print_LinkList(LinkList* list, PRINTLINKLIST print) { if (list == NULL) { return; } //辅助指针变量 LinkNode* pCurrent = &(list->head); while (pCurrent->next != NULL) { pCurrent = pCurrent->next; print(pCurrent->data); } } //释放链表内存 void FreeSpace_LinkList(LinkList* list) { if (list == NULL) { return; } //辅助指针变量 LinkNode* pCurrent = list->head.next; //缓存要释放的结点 LinkNode* delNode = NULL; while (pCurrent != NULL) { delNode = pCurrent; pCurrent = pCurrent->next; if (delNode != NULL) { free(delNode); } } //释放链表内存 list->size = 0; free(list); }
main.c源码:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include "LinkList.h" //自定义数据类型 typedef struct PERSON { char name[20]; int age; }Person; //打印函数 void MyPrint(Person* p) { if (p == NULL) { return; } printf("Name:%s Age:%d\n", p->name, p->age); } int main(void) { //创建数据 Person p1 = { "aaa", 21 }; Person p2 = { "bbb", 22 }; Person p3 = { "ccc", 23 }; Person p4 = { "ddd", 24 }; Person p5 = { "eee", 25 }; Person p6 = { "fff", 26 }; //创建链表 LinkList* list = Init_LinkList(); //数据插入链表 Insert_LinkList(list, 0, &p1); Insert_LinkList(list, 0, &p2); Insert_LinkList(list, 0, &p3); Insert_LinkList(list, 0, &p4); Insert_LinkList(list, 2, &p5); Insert_LinkList(list, 0, &p6); //打印链表 Print_LinkList(list, MyPrint); printf("链表大小:%d\n", Size_LinkList(list)); printf("----------------------\n"); // 删除某节点 Remove_LinkList(list, 4); Print_LinkList(list, MyPrint); printf("链表大小:%d\n", Size_LinkList(list)); printf("----------------------\n"); //查找某节点的位置 printf("p3的位置:%d\n", Find_LinkList(list, &p3)); printf("----------------------\n"); //获取第一个节点 Person* p = Front_LinkList(list); MyPrint(p); printf("----------------------\n"); //销毁链表 FreeSpace_LinkList(list); printf("\n"); system("pause"); return 0; }
相关文章推荐
- C++实现设计模式之——工厂模式
- CppUnit入门
- C++与类相关的关键词和修饰符说明
- C语言:输入输出
- c++通过指针实现队列
- 减少C++代码编译时间的方法
- C++顺序容器笔记
- C++ opencv 读取mp4文件
- C++基类的析构函数为什么是虚函数
- C++倒计时程序,可根据需求自行修改。
- C++作业6
- C语言文件操作一
- c++ for_each
- STL Iterator 迭代器
- C++实现设计模式之--单例模式
- C++图像处理中从硬盘读入图像文件,并将相应数据赋值给图像类的char**data成员
- c++实现矩阵的余弦相似度
- opencl的c++程序
- C++ socket函数解析
- C++ 虚函数表解析