顺序链表的C风格实现
1 //头文件 2 #ifndef _SEQLIST_H_ 3 #define _SEQLIST_H_ 4 //定义数据类型 5 typedef void SeqList; 6 typedef void SeqListNode; 7 8 //顺序链表的生成 9 SeqList* SeqList_Create(int capacity); 10 //顺序链表的删除 11 void SeqList_Destory(SeqList* list); 12 //顺序链表的清空 13 void SeqList_Clear(SeqList* list); 14 //返回链表长度 15 int SeqList_Length(SeqList* list); 16 //返回链表容量 17 int SeqList_Capacity(SeqList* list); 18 //在POS位置插入节点 19 int SeqList_Insert(SeqList* list, SeqListNode* node, int pos); 20 //获取POS位置的节点信息 21 SeqListNode* SeqList_Get(SeqList* list, int pos); 22 //删除POS位置的节点信息 23 SeqListNode* SeqList_Delete(SeqList* list, int pos); 24 25 #endif
1 //Cpp 2 3 #include "seqList.h" 4 #include <iostream> 5 using namespace std; 6 //定义一个链表头 7 typedef struct _tag_SeqList 8 { 9 int length; 10 int capacity; 11 unsigned int **node; // 使用**防止数据丢失 12 }TSeqList; 13 14 15 16 //创建一个线性表 17 SeqList* SeqList_Create(int capacity) 18 { 19 int ret = 0; 20 TSeqList *temp = NULL; //创建临时指针变量remp 21 22 temp = (TSeqList *)malloc((sizeof(TSeqList))); //分配内存 23 //异常处理 24 if (temp == NULL) 25 { 26 ret = -1; 27 cout << "SeqList_Create Err!" << endl; 28 return NULL; 29 } 30 memset(temp, 0, sizeof(TSeqList)); // 快速填充为0 31 32 //为所有节点分配内存空间 (*容量) 33 temp->node = (unsigned int **)malloc(sizeof(unsigned int *) * capacity); 34 35 36 if (temp->node == NULL) 37 { 38 ret = -2; 39 cout << "SeqList_Create Err! (malloc..)" << endl; 40 return NULL; 41 } 42 43 44 temp->capacity = capacity; 45 temp->length = 0; 46 return temp; 47 } 48 49 50 51 //删除(释放)一个线性表 52 void SeqList_Destory(SeqList* list) 53 { 54 TSeqList *tlist = NULL; 55 //判断是否为空 56 if(list == NULL) 57 { 58 cout << "Destory Err" << endl; 59 return ; 60 } 61 tlist = (TSeqList *)list; 62 //先释放node内存 再释放List内存 63 if (tlist->node != NULL) 64 { 65 free(tlist->node); 66 } 67 free(tlist); 68 69 return; 70 } 71 72 73 //清空一个线性表 74 void SeqList_Clear(SeqList* list) 75 { 76 TSeqList *tlist = NULL; 77 if(list == NULL) 78 { 79 cout << "Clear Err " << endl; 80 return ; 81 } 82 //直接将链表的长度重置为0 83 tlist = (TSeqList *)list; 84 tlist->length = 0; 85 return; 86 } 87 88 89 //返回一个线性表的长度 90 int SeqList_Length(SeqList* list) 91 { 92 TSeqList *tlist = NULL; 93 //异常处理 94 if(list == NULL) 95 { 96 cout << "Length Err, list == NULL" << endl; 97 return -1; 98 } 99 100 tlist = (TSeqList *)list; 101 return tlist->length; 102 } 103 104 105 //返回线性表的容量 106 int SeqList_Capacity(SeqList* list) 107 { 108 TSeqList *tlist = NULL; 109 //异常处理 110 if(list == NULL) 111 { 112 cout << "Capacity Err, list == NULL" << endl; 113 return -1; 114 } 115 tlist = (TSeqList *)list; 116 117 return tlist->capacity; 118 } 119 120 121 //在POS位置插入一个节点 122 int SeqList_Insert(SeqList* list, SeqListNode* node, int pos) 123 { 124 int i = 0; 125 int ret = 0; 126 TSeqList *tlist = NULL; 127 128 //异常处理 129 if(list == NULL || node == NULL || pos<0) 130 { 131 cout << "Insert Err, (list == NULL || node == NULL || pos<0)" << endl; 132 ret = -1; 133 return ret; 134 } 135 tlist = (TSeqList *)list; 136 137 //判断是否满了 138 if (tlist->length >= tlist->capacity) 139 { 140 cout << "满了" << endl; 141 ret = -2; 142 return ret; 143 } 144 //容错修正 如果插入的pos位置大于链表长度 并且此时容量未满 145 if (pos >= tlist->length) / 146 { 147 pos = tlist->length; 148 } 149 150 //位置后移并储存 151 for(i = tlist->length; i > pos; i--) 152 { 153 tlist->node[i] = tlist->node[i-1]; 154 } 155 //将node[i]改为node 156 tlist->node[i] = (unsigned int*) node; 157 tlist->length++; 158 return 0; 159 160 } 161 162 163 //获取节点信息 164 SeqListNode* SeqList_Get(SeqList* list, int pos) 165 { 166 TSeqList *tlist = NULL; 167 //异常处理 168 if(list == NULL || pos < 0) 169 { 170 cout << "SeqList_Get Err, list == NULL" << endl; 171 return NULL ; 172 } 173 tlist = (TSeqList *)list; 174 //强制类型转换 175 return (SeqListNode*)tlist->node[pos]; 176 } 177 178 179 //删除一个节点 180 SeqListNode* SeqList_Delete(SeqList* list, int pos) 181 { 182 TSeqList *tlist = NULL; 183 SeqListNode* ret = 0; 184 //异常处理 185 if(list == NULL || pos < 0) 186 { 187 cout << "Delete Err" << endl; 188 return NULL ; 189 } 190 tlist = (TSeqList *)list; 191 //将POS位置的node地址给临时ret指针变量 192 ret = (SeqListNode*)tlist->node[pos]; 193 //pos 位置后的元素往前移动 194 for(int i = pos + 1; i < tlist->length; i++) 195 { 196 tlist->node[i - 1] = tlist->node[i]; 197 } 198 tlist->length--; 199 //返回删除的元素 200 return ret; 201 }
测试代码:
1 #include "User.h" 2 #include "seqList.h" 3 #include <iostream> 4 5 using namespace std; 6 //定义一个结构体 7 typedef struct Teacher 8 { 9 int age; 10 char name[64]; 11 12 }teacher; 13 14 15 int main0() 16 { 17 int ret = 0; 18 int i = 0; 19 //创建顺序链表 20 SeqList* list = NULL; 21 list = SeqList_Create(10); 22 23 teacher t1,t2,t3,t4,t5; 24 25 t1.age = 31; 26 t2.age = 32; 27 t3.age = 33; 28 t4.age = 34; 29 t5.age = 35; 30 //头插法插入元素 31 ret = SeqList_Insert(list, (SeqListNode*) &t1, 9); //测试容错 32 ret = SeqList_Insert(list, (SeqListNode*) &t3, 0); 33 ret = SeqList_Insert(list, (SeqListNode*) &t4, 0); 34 ret = SeqList_Insert(list, (SeqListNode*) &t5, 0); 35 //遍历元素并显示age 36 for (;i < SeqList_Length(list); i++) 37 { 38 teacher* temp = (teacher*) SeqList_Get(list, i); 39 if (temp == NULL) 40 { 41 return 1; 42 } 43 //cout << "temp->age: " << ((teacher* )SeqList_Get(list, i))->age << endl; 44 cout << "temp->age: " << temp->age << endl; 45 } 46 cout << endl; 47 //删除 并显示删除结果 48 int m = 1; 49 while (SeqList_Length(list) > 0) 50 { 51 teacher *t = NULL; 52 t = (teacher*)SeqList_Delete(list, 0); 53 cout << "第" << m << "次头删的数据" << endl; 54 cout << "t->age" << t->age << endl; 55 m++; 56 cout << endl; 57 } 58 59 //每次遍历删除头部后的链表 60 /*int m = 1; 61 while (SeqList_Length(list) > 0) 62 { 63 SeqList_Delete(list, 0); 64 cout << "第" << m << "次头删的结果" << endl; 65 for (i = 0;i < SeqList_Length(list); i++) 66 { 67 teacher* temp = (teacher*) SeqList_Get(list, i); 68 //cout << "temp->age: " << ((teacher* )SeqList_Get(list, i))->age << endl; 69 cout << "temp->age: " << temp->age << endl; 70 } 71 m++; 72 cout << endl; 73 } 74 */ 75 system("pause"); 76 return 0; 77 }
转载于:https://www.cnblogs.com/Lxk0825/p/9519909.html
顺序链表的C风格实现相关推荐
- php数据结构之线性表,php数据结构之顺序链表与链式线性表示例
本文实例讲述了php数据结构之顺序链表与链式线性表.分享给大家供大家参考,具体如下: 链表操作 1. InitList(L):初始化链表 2. DestroyList(L):删除连接 3. Clear ...
- 链式链表的C风格实现
头文件: #ifndef _LINKLIST_H_ #define _LINKLIST_H_typedef void LinkList; //将数据的类型分离,相当于句柄//只是一个小节点 包含着位置 ...
- JAVA输出两个顺序链表的并集_(顺序表)两个集合求并集-洋葱先生-杨少通
注:本程序由Visual Studio 2015编写,与VC++6.0稍有区别,复制到VC++6.0下注释掉"#include "stdafx.h""即可运行, ...
- 顺序链表,动态数组实现
//SeqList.h //顺序表类的定义 #ifndef SEQLIST_H #define SEQLIST_H #include <iostream> using namespace ...
- 数据结构C语言实现顺序链表基本操作(插入,排序,合并)
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typedef int ElemType; ...
- c语言判断顺序链表是否为空,数据结构之线性表(五)——单链表(2 初始化,判断空表,销毁,清空,求表长)...
1.单链表(带头结点)的初始化 即,构造一个空表,如下图, 算法步骤: 1.生成新结点作头结点,用头指针L指向头结点. 2.将头指针的指针域置空. 算法描述: Status InitList_L(Li ...
- 数据结构之线性表(顺序表和链表)
线性表 首先线性表的定义就是:零个或多个数据元素的有限序列. 列如高考前每个班级排队照准考证,这个队伍就可以看做一个线性表,大家都井然有序的排着队,是一个有限的序列,一个班就那么几十个人,而且每个人之 ...
- 【 C 】在单链表中插入一个新节点的尝试(二)
在上篇博文中:[ C ]在单链表中插入一个新节点的尝试(一),我们最后提到了如果向单链表的开头(起始位置)插入一个节点,上篇博文中给出的程序显然完成不了这任务. 这篇博文中,我们将解决这个问题,给出一 ...
- java 反转链表、合并链表
第一个问题:反转链表 1. 题目描述 输入一个链表,反转链表后,输出新链表的表头. 2. 解题思路 定义三个指针: 第一个指针指向当前正在处理的节点: 第二个指针指向当前处理节点的下一个节点,该指针是 ...
- c语言 错误 无效的控制谓词,PAT 1025反转链表的代码实现及错误分析(C语言)
题目 给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转.例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4:如果K为4,则输出应该为4→3→2→1→5→6, ...
最新文章
- sgn matlab,matlab中.*的问题
- 资深算法工程师万宫玺:Java工程师转型AI的秘密法宝——深度学习框架Deeplearning4j | 分享总结
- 决策树之 C4.5 算法
- QT绘制嵌套的圆饼状图
- oracle 11g禁用和强制direct path read
- flume学习(一):log4jAppender直接输出日志到flume的avro-source
- VS2005发布网站问题及aspnet_merge.exe”已退出,代码为 1的错误以及所有代码文件生成一个dll
- 高中全国计算机信息学竞赛,高中信息学奥赛考什么
- OpenCV学习 之 IplImage*遍历每个像素点
- 怎么给图片添加水印?教你一键添加水印
- 生成对抗网络(六)----------Image Denoising Using a Generative Adversarial Network(用GAN对图像去噪)
- 代数数、超越数、代数函数、超越函数
- 配置iterms窗口在其他界面上悬浮
- [VBA]EXCEL同工作簿中多工作表合并VBA代码
- 屏蔽android的menu键,使menu键不能用,自定义menu键
- aegisub32汉化_Aegisub中文版(aegisub字幕特效)V3.2.3 免费版
- 整合SOUI的默认资源(soui-sys-resource.dll)
- helix qac 2022.1
- LeetCode_链表_环形链表_141
- AD 和 DA-基本概念