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风格实现相关推荐

  1. php数据结构之线性表,php数据结构之顺序链表与链式线性表示例

    本文实例讲述了php数据结构之顺序链表与链式线性表.分享给大家供大家参考,具体如下: 链表操作 1. InitList(L):初始化链表 2. DestroyList(L):删除连接 3. Clear ...

  2. 链式链表的C风格实现

    头文件: #ifndef _LINKLIST_H_ #define _LINKLIST_H_typedef void LinkList; //将数据的类型分离,相当于句柄//只是一个小节点 包含着位置 ...

  3. JAVA输出两个顺序链表的并集_(顺序表)两个集合求并集-洋葱先生-杨少通

    注:本程序由Visual Studio 2015编写,与VC++6.0稍有区别,复制到VC++6.0下注释掉"#include "stdafx.h""即可运行, ...

  4. 顺序链表,动态数组实现

    //SeqList.h //顺序表类的定义 #ifndef SEQLIST_H #define SEQLIST_H #include <iostream> using namespace ...

  5. 数据结构C语言实现顺序链表基本操作(插入,排序,合并)

    #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typedef int ElemType; ...

  6. c语言判断顺序链表是否为空,数据结构之线性表(五)——单链表(2 初始化,判断空表,销毁,清空,求表长)...

    1.单链表(带头结点)的初始化 即,构造一个空表,如下图, 算法步骤: 1.生成新结点作头结点,用头指针L指向头结点. 2.将头指针的指针域置空. 算法描述: Status InitList_L(Li ...

  7. 数据结构之线性表(顺序表和链表)

    线性表 首先线性表的定义就是:零个或多个数据元素的有限序列. 列如高考前每个班级排队照准考证,这个队伍就可以看做一个线性表,大家都井然有序的排着队,是一个有限的序列,一个班就那么几十个人,而且每个人之 ...

  8. 【 C 】在单链表中插入一个新节点的尝试(二)

    在上篇博文中:[ C ]在单链表中插入一个新节点的尝试(一),我们最后提到了如果向单链表的开头(起始位置)插入一个节点,上篇博文中给出的程序显然完成不了这任务. 这篇博文中,我们将解决这个问题,给出一 ...

  9. java 反转链表、合并链表

    第一个问题:反转链表 1. 题目描述 输入一个链表,反转链表后,输出新链表的表头. 2. 解题思路 定义三个指针: 第一个指针指向当前正在处理的节点: 第二个指针指向当前处理节点的下一个节点,该指针是 ...

  10. 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, ...

最新文章

  1. sgn matlab,matlab中.*的问题
  2. 资深算法工程师万宫玺:Java工程师转型AI的秘密法宝——深度学习框架Deeplearning4j | 分享总结
  3. 决策树之 C4.5 算法
  4. QT绘制嵌套的圆饼状图
  5. oracle 11g禁用和强制direct path read
  6. flume学习(一):log4jAppender直接输出日志到flume的avro-source
  7. VS2005发布网站问题及aspnet_merge.exe”已退出,代码为 1的错误以及所有代码文件生成一个dll
  8. 高中全国计算机信息学竞赛,高中信息学奥赛考什么
  9. OpenCV学习 之 IplImage*遍历每个像素点
  10. 怎么给图片添加水印?教你一键添加水印
  11. 生成对抗网络(六)----------Image Denoising Using a Generative Adversarial Network(用GAN对图像去噪)
  12. 代数数、超越数、代数函数、超越函数
  13. 配置iterms窗口在其他界面上悬浮
  14. [VBA]EXCEL同工作簿中多工作表合并VBA代码
  15. 屏蔽android的menu键,使menu键不能用,自定义menu键
  16. aegisub32汉化_Aegisub中文版(aegisub字幕特效)V3.2.3 免费版
  17. 整合SOUI的默认资源(soui-sys-resource.dll)
  18. helix qac 2022.1
  19. LeetCode_链表_环形链表_141
  20. AD 和 DA-基本概念

热门文章

  1. posix线程使用详解
  2. 纯新手DSP编程--5.31--硬件中断管理
  3. 单链表(线性表的链式存储)---C语言版
  4. Hbase过滤器与scala编程
  5. scala List入门到熟悉
  6. Win32汇编——过程控制(进程调试和进程隐藏)
  7. 爬虫第四章 单线程+多任务异步协程
  8. django开发-在Docker中部署django项目
  9. 《Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法》笔记
  10. linux下面修改默认的shell