一个基于c语言的顺序表结构

头文件

#ifndef _SEQUENCE_LIST_H_
#define _SEQUENCE_LIST_H_
#define SIZE 20
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct sequence_list
{
    int *head;    //申明长度不确定的数组
    int length;   //记录当前顺序表的长度
    int size;     //记录书序表分配的存储容量

} sequence_list;
sequence_list *Init_sequence_list(void);//返回一个sequence_list类型的结构
void rmvalue_sequence_list(sequence_list *my_list, int value);
int find_sequence_list(sequence_list *my_list, int find_elem);
void push_sequence_list(sequence_list *my_list, int value);
void remove_sequence_list(sequence_list *my_list, int pos);
int get_sequence_list(sequence_list *my_list, int pos);
void printf_sequence_list(sequence_list *my_list);
void clear_sequence_list(sequence_list *my_list);
void free_sequence_list(sequence_list *my_list);
int Size_sequence_list(sequence_list *my_list);
int length_sequence_list(sequence_list *my_list);

#endif

顺序表功能实现函数。有详细的注释

#include "sequence_list.h"
/*顺序表初始化函数*/
sequence_list *Init_sequence_list(void) //返回一个sequence_list类型的结构
{
   sequence_list *my_list;
  if (NULL == (my_list = (sequence_list *)malloc(sizeof(sequence_list))))
  {
    printf("malloc error!"); //判断内存是否申请成功
    return NULL;
  }
  my_list->size = SIZE; //定义初始化数组大小 在.h文件中

  my_list->length = 0;  //记录当前的位置

  my_list->head = (int *)malloc(sizeof(int) * SIZE); //为数组开辟空间

  return my_list;
}

/*查找顺序表中的元素,返回此元素的位置*/
int find_sequence_list(sequence_list *my_list, int find_elem)
{
  if (my_list == NULL)
  {
    printf("find fail!");
    return -1;
  }
  for (int i = 0; i < my_list->length; i++)
  {
    if (find_elem == my_list->head[i])
    {

      printf("%d\n", my_list->length);
    }
    return 0;
  }
}
/*打印顺序表*/
void printf_sequence_list(sequence_list *my_list)
{
  if (my_list == NULL)
  {
    return;
  }
  for (int i = 0; i < my_list->length; i++)
  {
    printf(" %d", my_list->head[i]);   //加空格以好区分
  }
  printf("\n");
}
/*清空顺序表*/
void clear_sequence_list(sequence_list *my_list)
{
  if (my_list == NULL)
  {
    return;
  }
  my_list->length = 0;                 //让当前的长度为0就可以实现
}
/*释放顺序表表空间*/
void free_sequence_list(sequence_list *my_list)
{

  if (my_list == NULL)
  {
    return;
  }
  if (my_list->head != NULL)
  {
    free(my_list->head);
  }
  free(my_list);
}
/*获得某个位置的元素*/
int get_sequence_list(sequence_list *my_list, int pos)
{
  if (my_list == NULL)
  {
    return -1;
  }
  return my_list->head[pos];
}
/*尾部插入某个元素*/
void push_sequence_list(sequence_list *my_list, int value)
{
  if (my_list == NULL)
  {
    return;
  }
  if (my_list->size == my_list->length) //这里判断数组的元素个数是否满了,满了则开辟新的空间
  {
    int *newSpace = (int *)malloc(sizeof(int) * my_list->size * 2); //默认个新空间是旧空间的两倍
    memcpy(newSpace, my_list->head, my_list->size * sizeof(int));   //注意memcpy的第三个参数是字节数,而不是元素个数
    free(my_list->head);                                            //释放原来的旧空间
    my_list->size = my_list->size * 2;
    my_list->head = newSpace;
  }
  my_list->head[my_list->length] = value; //插入新的元素
  my_list->length++;                      //长度++
}
/*根据位置删除元素*/
void remove_sequence_list(sequence_list *my_list, int pos)
{
  if (my_list == NULL)
  {
    return;
  }
  if (pos < 0 || pos >= my_list->length)
  {
    printf("pos error");
    return;
  }
  for (int i = pos; i < my_list->length; i++)
  {
    my_list->head[i] = my_list->head[i+1];
  }
  my_list->length--;
}
/*根据值删除*/
void rmvalue_sequence_list(sequence_list *my_list, int value)
{
  int pos = -1;
  if (my_list == NULL)
  {
    return;
  }
  for (int i = 0; i < my_list->length; i++)
  {
    if (my_list->head[i] == value)
    {
      pos = i; 
      printf("%d\n",pos);
      break;
    }
  }
  remove_sequence_list(my_list, pos);
}
/*获得当前数组容量*/
int Size_sequence_list(sequence_list *my_list)
{
if (my_list == NULL)
  {
    return -1;
  }
  return my_list->size;
}
/*获得当前长度*/
int length_sequence_list(sequence_list *my_list)
{
  if (my_list == NULL)
  {
    return -1;
  }
  return my_list->length;
}

主函数做了测试,完美运行,未发现bug。还望大佬指正!

在这#include "sequence_list.h"
int main(void)
{

  sequence_list *test_list = Init_sequence_list();
  printf ("当前长度:%d\n",length_sequence_list(test_list));
  for (int i = 0; i < 20; i++)
  {
     push_sequence_list(test_list, i);

  }   
      //clear_sequence_list(test_list);
      printf ("当前长度:%d\n",length_sequence_list(test_list)); 
      rmvalue_sequence_list(test_list, 1); 
      //remove_sequence_list(test_list, 0);
     // printf ("位置:%d\n",get_sequence_list(test_list, 10));
      printf_sequence_list(test_list);
      free_sequence_list(test_list);
     
     return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lobmo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值