不学网

 找回密码
 立即注册

只需一步,快速开始

手机号码,快捷登录

查看: 350|回复: 0

[c/c++] [C数据结构]顺序表

[复制链接]
j2cat 发表于 2018-1-6 18:52:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
SeqList.h
  1. #ifndef _SEQLIST_H_
  2. #define _SEQLIST_H_

  3. typedef void Seqlist;
  4. typedef void Seqlistnode;

  5. Seqlist* seqlist_create(int capacity); //创建顺序表
  6. int seqlist_insert(Seqlist* list, Seqlistnode* node, int pos); //顺序表插入元素
  7. int seqlist_length(Seqlist* list);//获取顺序表长度
  8. int seqlist_capacity(Seqlist* list);//获取数序表容量
  9. Seqlistnode* seqlistnode_delete(Seqlist* list, int pos);//顺序表删除POS位元素节点
  10. Seqlistnode* seqlistnode_get(Seqlist* list, int pos); //顺序表获取POS位元素节点
  11. void seqlist_destroy(Seqlist* list);//销毁顺序表
  12. void seqlist_clear(Seqlist* list);//清空顺序表


  13. #endif
复制代码
SeqList.c
  1. #include "seqlist.h"
  2. #include <stdio.h>
  3. #include <malloc.h>

  4. typedef unsigned int TSeqListNode;

  5. typedef struct _tag_seq_list{
  6.         int capacity; //链表容量
  7.         int length;   //链表长度
  8.         TSeqListNode* node;//链表node节点
  9. }TSeqList;

  10. Seqlist* seqlist_create(int capacity){
  11.         TSeqList* ret = NULL;
  12.         if (capacity >= 0){
  13.                 ret = (TSeqList*)malloc(sizeof(TSeqList) + (sizeof(TSeqListNode) * capacity));
  14.         }
  15.         if (NULL != ret){
  16.                 ret->capacity = capacity;
  17.                 ret->length = 0;
  18.                 ret->node = (TSeqListNode*)(ret+1);
  19.         }
  20.        
  21.         return ret;
  22. }

  23. int seqlist_insert(Seqlist* list, Seqlistnode* node, int pos){
  24.         TSeqList* slist = (TSeqList*)list;
  25.         int ret = (NULL != slist);
  26.         ret = ret && (0 <= pos) && (slist->length+1 <= slist->capacity);
  27.         if (ret){
  28.                 if (pos >= slist->length){
  29.                         pos = slist->length;
  30.                 }
  31.                 int i;
  32.                 for(i = slist->length; i > pos; --i){
  33.                         slist->node[i] = slist->node[i-1];
  34.                 }
  35.                 slist->node[i] = (TSeqListNode)node;
  36.                 slist->length++;
  37.         }
  38.        
  39.         return ret;
  40.        
  41. }

  42. int seqlist_length(Seqlist* list){
  43.         TSeqList* slist = (TSeqList*)list;
  44.         int ret = -1;
  45.         if (NULL != slist){
  46.                 ret = slist->length;
  47.         }
  48.         return ret;
  49. }

  50. int seqlist_capacity(Seqlist* list){
  51.         TSeqList* slist = (TSeqList*)list;
  52.         int ret = -1;
  53.         if (NULL != slist){
  54.                 ret = slist->capacity;
  55.         }
  56.        
  57.         return ret;
  58. }

  59. Seqlistnode* seqlistnode_get(Seqlist* list, int pos){
  60.         TSeqList* slist = (TSeqList*)list;
  61.         Seqlistnode* ret = NULL;
  62.         if(0 <= pos && pos < slist->length){
  63.                 ret = (Seqlistnode*)slist->node[pos];
  64.         }
  65.         return ret;
  66. }
  67. Seqlistnode* seqlistnode_delete(Seqlist* list, int pos){
  68.         TSeqList* slist = (TSeqList*)list;
  69.         TSeqListNode* ret = (TSeqListNode*)seqlistnode_get(slist, pos);
  70.         if (NULL != ret){
  71.                 for(int i = pos; i < slist->length-1; ++i){
  72.                         slist->node[i] = slist->node[i+1];
  73.                 }
  74.                 slist->length--;
  75.         }
  76.         return ret;
  77. }

  78. void seqlist_destroy(Seqlist* list){
  79.         TSeqList* slist = (TSeqList*)list;
  80.         free(slist);
  81. }

  82. void seqlist_clear(Seqlist* list){
  83.         TSeqList* slist = (TSeqList*)list;
  84.         if (NULL != slist){
  85.                 slist->length = 0;
  86.         }
  87. }
复制代码
main.c
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "seqlist.h"
  4. int main(){
  5.         Seqlist* list = seqlist_create(5);
  6.         int arr[5] = {111,3252,7657,1321,5684};
  7.         seqlist_insert(list, arr+0, 0);
  8.         seqlist_insert(list, arr+1, 0);
  9.         seqlist_insert(list, arr+2, 0);
  10.         seqlist_insert(list, arr+3, 0);
  11.         seqlist_insert(list, arr+4, 0);
  12.        
  13.         printf("顺序表当前容量:%d, 当前长度:%d\n", seqlist_capacity(list), seqlist_length(list));

  14.         int *p = (int *)seqlistnode_get(list, 0);
  15.         if (p != NULL)
  16.         for(int i = 0; i < seqlist_length(list); i++){
  17.                 printf("顺序表第%d位: %d\n", i, *(int *)seqlistnode_get(list, i));
  18.         }
  19.        
  20.         seqlist_clear(list);
  21.         printf("清空顺序表后,当前容量:%d, 当前长度:%d\n", seqlist_capacity(list), seqlist_length(list));
  22.         seqlist_insert(list, arr+0, 0);
  23.         seqlist_insert(list, arr+1, 1);
  24.         seqlist_insert(list, arr+2, 2);
  25.         seqlist_insert(list, arr+3, 3);
  26.         seqlist_insert(list, arr+4, 4);
  27.         puts("从新插入后:");
  28.         for(int i = 0; i < seqlist_length(list); i++){
  29.                 printf("顺序表第%d位: %d\n", i, *(int *)seqlistnode_get(list, i));
  30.         }
  31.         int tmp = *(int*)seqlistnode_delete(list, 0);
  32.         printf("删除第0位元素%d后:", tmp);
  33.         printf("顺序表当前容量:%d, 当前长度:%d\n", seqlist_capacity(list), seqlist_length(list));
  34.        
  35.         for(int i = 0; i < seqlist_length(list); i++){
  36.                 printf("顺序表第%d位: %d\n", i, *(int *)seqlistnode_get(list, i));
  37.         }
  38.         seqlist_destroy(list);
  39.         return 0;
  40.        
  41. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|不学网

GMT+8, 2018-9-19 05:16

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表