数据结构C语言版(三)链表的实现
2020-07-12 17:29
309 查看
1. 动态链表
由于事先不知道需要分配多少内存空间,所以这种链表在后续插入的时候需要动态申请存储空间,并且存储空间不一定连续, 在进行插入和删除时则不需要移动元素, 修改指针域即可,所以仍然具有链表的主要优点,链表结构可以是动态地分配存储的,即在需要时才开辟结点的存储空间,实现动态链接。
2.C语言实现
单向链表的数据结构可以分为两部分:数据域和指针域,数据域存储数据,指针域指向下一个储存节点的地址
将指针域定义在数据域之前可以有效的减少代码量。
//在实现动态链表前先定义结构体 //链表节点数据结构 struct Linknode { struct Linknode * next;//用来存放指针 }; //链表结构体 struct Linklist { Linknode header; int size; };
.h文件用来声明函数
#pragma once #include<stdio.h> #include<stdlib.h> #include<string.h> #ifdef __cplusplus extern "C"{ #endif // __cplusplus //链表节点数据结构 struct Linknode { struct Linknode * next; }; //链表结构体 struct Linklist { Linknode header; int size; }; typedef void * LList;//定义void * 类型方便用户阅读 //链表初始化 LList InitializeList(); //遍历 void Ergodiclist(LList list,void (*print)(void *data)); //插入 void InsertList(LList list,int pos,void * data); //位置删除 void RemoveListpos(LList list ,int pos); //销毁 void DestroyList(LList list); #ifdef __cplusplus } #endif // __cplusplus
函数实现
#include"onewaylist1.h" //typedef void * LList; //链表初始化 LList InitializeList() { struct Linklist * list = (struct Linklist *)malloc(sizeof(Linklist));//开辟内存空间 //初始化链表 list->size = 0; list->header.next = NULL; return list; } //遍历 void Ergodiclist(LList list,void (*print)(void *data)) { if(NULL == list) return; if (NULL == print) return; struct Linklist * mylist= (struct Linklist *)list; struct Linknode * pCurrent = mylist->header.next; while (pCurrent != NULL) { print(pCurrent); pCurrent = pCurrent->next; } } //插入 void InsertList(LList list,int pos,void * data) { if(NULL == list) return; if (NULL == data) return; struct Linklist * link = (struct Linklist * )list; struct Linknode * mydate = (struct Linknode * )data; if(pos <0 || pos>link->size-1) pos = link->size; struct Linknode * pCurrent = &(link->header); for (int i = 0; i < pos; i++) { pCurrent = pCurrent->next; } mydate->next=pCurrent->next; pCurrent->next = mydate; link->size++; } //位置删除 void RemoveListpos(LList list ,int pos) { if(NULL == list) return; struct Linklist * mylist = (struct Linklist *)list; if (pos<0 || pos >mylist->size-1) return; struct Linknode * pCurrent = &(mylist->header); for (int i = 0; i < pos; i++) { pCurrent=pCurrent->next; } struct Linknode * delnode = pCurrent->next; pCurrent->next = delnode->next;//内存不是自己开辟的不需要释放内存 mylist->size--; } //销毁 void DestroyList(LList list) { struct Linklist * mylist = (struct Linklist *)list; free(mylist); mylist->header.next = NULL; }
调用函数并输出结果
#include"onewaylist1.h" struct person { struct Linknode next; char name[64]; int age; }; void myprint(void * data) { struct person * p = (struct person *) data; printf("name : %s age : %d\n",p->name,p->age); } void myclear(void * data) { struct person * p = (struct person *) data; free(p); } void test01() { person p1 ={NULL,"a",10}; person p2 ={NULL,"b",20}; person p3 ={NULL,"c",30}; person p4 ={NULL,"d",40}; person p5 ={NULL,"e",50}; person p6 ={NULL,"f",60}; person p7 ={NULL,"g",70}; LList list = InitializeList(); InsertList(list,0,&p1);//1 InsertList(list,1,&p2);//1 2 InsertList(list,2,&p3);//1 2 3 InsertList(list,1,&p4);//1 4 2 3 InsertList(list,5,&p5);//14235 InsertList(list,3,&p6);//142635 InsertList(list,0,&p7);//7142635 Ergodiclist(list,myprint); RemoveListpos(list,0);//142635 printf("----------------------\n"); Ergodiclist(list,myprint); DestroyList(list); } void main() { test01(); }
相关文章推荐
- 数据结构C语言版--单链表的基本功能实现
- Redis设计与实现——链表与字典
- C语言面向对象编程(五):单链表实现(转)
- 自己实现链表数据结构 LinkedList
- C++使用单指针Struct实现双向链表
- c++中的双向链表写法,主要实现(增删查改,链表逆置,构造函数,运算符重载,等)
- PHP实现链表(暂存)
- Java实现-删除链表中倒数第n个节点
- 用单链表实现的内存管理
- 简单的c语言链表的实现
- 经典数据结构之队列的链表实现方法
- 【Java】简单实现单向链表
- 队列(链表实现)
- linux内核实现的通用链表思想
- 多项式乘法与加法运算(链表实现)
- C语言实现双向循环链表
- 程序员面试金典: 9.2链表 2.6给定有环链表,实现算法返回环路的开头节点
- 图的广度优先遍历,基于邻接链表实现
- java链表增删查改等功能的实现
- 链表的实现(C语言)__一步一步来