顺序链表的C风格实现
来源:互联网 发布:淘宝论坛推广方法 编辑:程序博客网 时间:2024/05/21 15:39
//头文件#ifndef _SEQLIST_H_#define _SEQLIST_H_//定义数据类型typedef void SeqList;typedef void SeqListNode;//顺序链表的生成SeqList* SeqList_Create(int capacity);//顺序链表的删除void SeqList_Destory(SeqList* list);//顺序链表的清空void SeqList_Clear(SeqList* list);//返回链表长度int SeqList_Length(SeqList*list);//返回链表容量int SeqList_Capacity(SeqList* list);//在POS位置插入节点int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);//获取POS位置的节点信息SeqListNode* SeqList_Get(SeqList* list, int pos);//删除POS位置的节点信息SeqListNode* SeqList_Delete(SeqList* list, int pos);#endif
//Cpp#include "seqList.h"#include <iostream>using namespace std;//定义一个链表头typedef struct _tag_SeqList{int length;int capacity;unsigned int **node; // 使用**防止数据丢失}TSeqList;//创建一个线性表SeqList* SeqList_Create(int capacity){int ret = 0;TSeqList *temp = NULL; //创建临时指针变量remptemp = (TSeqList *)malloc((sizeof(TSeqList))); //分配内存//异常处理if (temp == NULL){ret = -1;cout << "SeqList_Create Err!" << endl;return NULL;}memset(temp, 0, sizeof(TSeqList)); // 快速填充为0//为所有节点分配内存空间 (*容量)temp->node = (unsigned int **)malloc(sizeof(unsigned int *) * capacity);if (temp->node == NULL){ret = -2;cout << "SeqList_Create Err! (malloc..)" << endl;return NULL;}temp->capacity = capacity;temp->length = 0;return temp;}//删除(释放)一个线性表void SeqList_Destory(SeqList* list){TSeqList *tlist = NULL; //判断是否为空if(list == NULL){cout << "Destory Err" << endl;return ;}tlist = (TSeqList *)list;//先释放node内存 再释放List内存if (tlist->node != NULL){free(tlist->node);}free(tlist);return;}//清空一个线性表void SeqList_Clear(SeqList* list){TSeqList *tlist = NULL; if(list == NULL){cout << "Clear Err " << endl;return ;}//直接将链表的长度重置为0tlist = (TSeqList *)list;tlist->length = 0;return;}//返回一个线性表的长度int SeqList_Length(SeqList*list){TSeqList *tlist = NULL; //异常处理if(list == NULL){cout << "Length Err, list == NULL" << endl;return -1;}tlist = (TSeqList *)list;return tlist->length;}//返回线性表的容量int SeqList_Capacity(SeqList* list){TSeqList *tlist = NULL; //异常处理if(list == NULL){cout << "Capacity Err, list == NULL" << endl;return -1;}tlist = (TSeqList *)list;return tlist->capacity;}//在POS位置插入一个节点int SeqList_Insert(SeqList* list, SeqListNode* node, int pos){int i = 0;int ret = 0;TSeqList *tlist = NULL; //异常处理if(list == NULL || node == NULL || pos<0){cout << "Insert Err, (list == NULL || node == NULL || pos<0)" << endl;ret = -1;return ret;}tlist = (TSeqList *)list;//判断是否满了if (tlist->length >= tlist->capacity){cout << "满了" << endl;ret = -2;return ret;}//容错修正 如果插入的pos位置大于链表长度 并且此时容量未满if (pos >= tlist->length) /////////{pos = tlist->length;}//位置后移并储存for(i = tlist->length; i > pos; i--){tlist->node[i] = tlist->node[i-1];}//将node[i]改为nodetlist->node[i] = (unsigned int*) node;tlist->length++;return 0;}//获取节点信息SeqListNode* SeqList_Get(SeqList* list, int pos){TSeqList *tlist = NULL; //异常处理if(list == NULL || pos < 0){cout << "SeqList_Get Err, list == NULL" << endl;return NULL ;}tlist = (TSeqList *)list;//强制类型转换return (SeqListNode*)tlist->node[pos];}//删除一个节点SeqListNode* SeqList_Delete(SeqList* list, int pos){TSeqList *tlist = NULL; SeqListNode* ret = 0;//异常处理if(list == NULL || pos < 0){cout << "Delete Err" << endl;return NULL ;}tlist = (TSeqList *)list;//将POS位置的node地址给临时ret指针变量ret = (SeqListNode*)tlist->node[pos];//pos 位置后的元素往前移动for(int i = pos + 1; i < tlist->length; i++){tlist->node[i - 1] = tlist->node[i];}tlist->length--;//返回删除的元素return ret;}
测试框架如下:
#include "User.h"#include "seqList.h"#include <iostream>using namespace std;//定义一个结构体typedef struct Teacher{int age;char name[64];}teacher;int main0(){int ret = 0;int i = 0;//创建顺序链表SeqList* list = NULL;list = SeqList_Create(10);teacher t1,t2,t3,t4,t5;t1.age = 31;t2.age = 32;t3.age = 33;t4.age = 34;t5.age = 35;//头插法插入元素ret = SeqList_Insert(list, (SeqListNode*) &t1, 9); //测试容错ret = SeqList_Insert(list, (SeqListNode*) &t3, 0);ret = SeqList_Insert(list, (SeqListNode*) &t4, 0);ret = SeqList_Insert(list, (SeqListNode*) &t5, 0);//遍历元素并显示agefor (;i < SeqList_Length(list); i++){teacher* temp = (teacher*) SeqList_Get(list, i);if (temp == NULL){return 1;}//cout << "temp->age: " << ((teacher* )SeqList_Get(list, i))->age << endl;cout << "temp->age: " << temp->age << endl;}cout << endl;//删除 并显示删除结果int m = 1;while (SeqList_Length(list) > 0){teacher *t = NULL;t = (teacher*)SeqList_Delete(list, 0);cout << "第" << m << "次头删的数据" << endl;cout << "t->age" << t->age << endl;m++;cout << endl;}//每次遍历删除头部后的链表/*int m = 1;while (SeqList_Length(list) > 0){SeqList_Delete(list, 0);cout << "第" << m << "次头删的结果" << endl;for (i = 0;i < SeqList_Length(list); i++){teacher* temp = (teacher*) SeqList_Get(list, i);//cout << "temp->age: " << ((teacher* )SeqList_Get(list, i))->age << endl;cout << "temp->age: " << temp->age << endl;}m++;cout << endl;}*/system("pause");return 0;}
阅读全文
0 0
- 顺序链表的C风格实现
- 基于顺序链表的栈的顺序存储的C风格实现
- 链式链表的C风格实现
- 循环链表的C风格实现(单向)
- 顺序表的C实现
- 【C++】顺序表的实现
- 【C++】顺序表的实现
- 【C++】实现顺序表
- 【c++】实现顺序表
- c语言,顺序空间游标链表的实现
- C语言实现顺序存储结构的循环链表
- 顺序表的类C实现
- 数据结构(C++)顺序表的实现
- 线性表的顺序实现(C语言)
- 线性表的顺序实现(C++)
- 顺序表的C语言实现
- 数据结构的C实现_顺序表
- 线性表的顺序实现(c语言)
- JQuery AJAX $.ajax()方法
- 全新安装 Mac 系统正式版U盘USB启动安装盘方法教程
- Thinking in java-38 Java 泛型Generics in java
- 人工智能初学者入门指南:什么是强AI?
- H5移动端ios 滚动优化
- 顺序链表的C风格实现
- 马尔可夫模型日记——如何模拟真正的概率系统
- H5 CSS基础一:行内元素和块元素
- MacOS查看和设定JAVA_HOME
- 《伯克毕生发展心理学3》
- 前端 jquery-ajax 的简单案例分析和总结
- jQuery、
- 顺序栈的简单实现
- user/login.do isn't a valid redirect URL