线性表顺序存储实现
来源:互联网 发布:c语言中的单词计数 编辑:程序博客网 时间:2024/05/21 17:55
/************头文件***********/
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
typedef void SeqList;
typedef void SeqListNode;
//创建并且返回一个空的线性表
SeqList* SeqList_Create();
//销毁一个线性表
void SeqList_Destroy(SeqList* list);
//将一个线性表list中的所有元素清空,线性表回到创建时的初始状态
void SeqList_Clear(SeqList* list);
//返回一个线性表list中的所有元素个数
int SeqList_Length(SeqList* list);
int SeqList_Capacity(SeqList* list);
//向一个线性表list的pos位置处插入新元素node
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);
//获取一个线性表list的pos位置处的元素
SeqListNode* SeqList_Get(SeqList* list, int pos);
//删除一个线性表list的pos位置处的元素 返回值为被删除的元素, NULL表示删除失败
SeqListNode* SeqList_Delete(SeqList* list, int pos);
#endif/****************实现代码*************/
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "seqlist.h"//在结构体中套2级指针
typedef struct _tag_Seqlist{int length;int capacity;unsigned int **node; //int *node[] 指针数组退化为二级指针//unsigned int* array[capacity];//数组元素不能用capacity,不确定值!}TSeqlist;
//创建并且返回一个空的线性表
SeqList* SeqList_Create(int capacity){int ret = 0;TSeqlist* tmp = NULL;tmp = (TSeqlist*)malloc(sizeof(TSeqlist));//此处长度 sizeof(TSeqlist)if (tmp == NULL){ret = -1;printf("func Seqlist_Create() err: %d\n", ret);return NULL;}memset(tmp, 0, sizeof(TSeqlist));//根据capacity的大小分配节点的空间
tmp->node = (unsigned int **)malloc(sizeof(unsigned int*)*capacity);//此处长度 sizeof(unsigned int *),因为int *node[],存放的是指针;if (tmp->node == NULL){ret = -2;printf("func Seqlist_Create() err: malloc err %d\n", ret);return NULL;}tmp->capacity = capacity;tmp->length = 0;return tmp;}//销毁一个线性表
void SeqList_Destroy(SeqList* list){TSeqlist* tlist = NULL;if(list == NULL){return ;}tlist = (TSeqlist*)list;if (tlist->node != NULL){free(tlist->node);
tlist->node = NULL;}free(tlist);return;
}//将一个线性表list中的所有元素清空,线性表回到创建时的初始状态
void SeqList_Clear(SeqList* list){TSeqlist* tlist = NULL;if (list == NULL){return;
}tlist = (TSeqlist*)list;tlist->length = 0;return;
}//返回一个线性表list中的所有元素个数
int SeqList_Length(SeqList* list){TSeqlist* tlist = NULL;if (list == NULL){return -1;}tlist = (TSeqlist*)list;return tlist->length;}// 返回一个线性表list的总大小int SeqList_Capacity(SeqList* list){TSeqlist* tlist = NULL;if (list == NULL){return -1;}tlist = (TSeqlist*)list;return tlist->capacity;}//向一个线性表list的pos位置处插入新元素node
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos){int i = 0, ret = 0;TSeqlist* tlist = NULL;if (list == NULL || list == NULL || pos < 0){ret = -1;printf("func SeqList_Insert() err; %d \n", ret);return ret;}tlist = (TSeqlist*)list;//判断是不是满了
if (tlist->length >= tlist->capacity){ret = -2;printf("func SeqList_Insert() err; %d \n", ret);return ret;}//容错修正 6个长度 容量20 用户pos10位置插入if (pos >= tlist->length){pos = tlist->length;}//元素后移
for (i = tlist->length; i > pos; i--){tlist->node[i] = tlist->node[i - 1];}//插入元素
tlist->node[i] =(unsigned int*) node;//此处插入元素,给node[]的i号节点赋值 tlist->node[i] = node;tlist->length++;
return 0;}//获取一个线性表list的pos位置处的元素
SeqListNode* SeqList_Get(SeqList* list, int pos){int i = 0;TSeqlist *ret = NULL;TSeqlist *tlist = NULL;if (list == NULL || pos < 0){printf("func SeqList_Get err: %d\n", ret);return ret;}tlist = (TSeqlist*)list;ret = (void*)tlist->node[pos];return ret;}//删除一个线性表list的pos位置处的元素 返回值为被删除的元素, NULL表示删除失败SeqListNode* SeqList_Delete(SeqList* list, int pos){int i = 0;TSeqlist *ret = NULL;TSeqlist *tlist = NULL;if (list == NULL || pos < 0)//检查{printf("func SeqList_Get err: %d\n", ret);return ret;}tlist = (TSeqlist*)list;ret = (SeqListNode*)tlist->node[pos];//缓存pos位置for (i = pos + 1; i < tlist->length; i++)//pos位置后面元素前移{tlist->node[i - 1] = tlist->node[i];}tlist->length--;
return ret;}/****************测试代码*************/
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "seqlist.h"typedef struct teacher{char name[64];int age;}Teacher;
int main(){int ret = 0, i = 0;SeqList* list = NULL;Teacher t1, t2, t3, t4, t5;t1.age = 31;t2.age = 32;t3.age = 33;t4.age = 34;t5.age = 35;list = SeqList_Create(10);if (list == NULL){printf("func Seqlist_Create() ret; %d\n", ret);return ret;}ret = SeqList_Insert(list, (SeqListNode*)&t1, 0); //头插法ret = SeqList_Insert(list, (SeqListNode*)&t2, 0); //头插法ret = SeqList_Insert(list, (SeqListNode*)&t3, 0); //头插法ret = SeqList_Insert(list, (SeqListNode*)&t4, 0); //头插法ret = SeqList_Insert(list, (SeqListNode*)&t5, 6); //头插法//遍历
for (i = 0; i < SeqList_Length(list); i++){Teacher* tmp = (Teacher*)SeqList_Get(list, i);if (tmp == NULL){return ret;}printf("tmp->age:%d\n", tmp->age);}//删除链表中的节点
while (SeqList_Length(list) >0){SeqList_Delete(list, 0);}system("pause");
return ret;}
0 0
- 线性表---顺序存储实现
- 线性表顺序存储实现
- 线性表的顺序存储实现
- 数组实现线性表的顺序存储
- 线性表顺序存储结构实现
- 线性表顺序存储--C实现
- java实现线性表的顺序存储
- 线性表的Java实现--顺序存储
- java 实现线性表之顺序存储
- 线性表的顺序存储实现
- 线性表顺序存储(C++ 实现)
- 线性表的动态顺序存储实现
- 线性表之顺序存储实现
- 线性表的顺序存储的实现
- 线性表顺序存储结构实现
- C++实现顺序存储的线性表
- 模拟实现线性表-顺序存储方式
- 线性表的动态顺序存储实现
- Redis下载安装 这个Redis-server在windows7下闪退
- npm中package.json详解
- Apache 配置虚拟主机三种方式
- iOS学习笔记-015.UISegmentedControl——选项卡控件
- 高并发架构详解
- 线性表顺序存储实现
- 使用oracle function和存储过程返回单个值
- 网摘 阻塞 非阻塞 同步 异步 区别
- 黑客与画家之路
- UE4材质节点
- MongoDB_8天学通MongoDB——第一天 基础入门
- spring boot actuator 入门荔枝
- 指针
- Caffe学习系列(6):Blob,Layer and Net以及对应配置文件的编写