C语言顺序表的实现代码

 更新时间:2017年09月20日 17:25:25   作者:Tom文星  
这篇文章主要为大家详细介绍了C语言实现顺序表的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C语言实现顺序表的具体代码,供大家参考,具体内容如下

seqlist.h

#ifndef __SEQLIST_H__
#define __SEQLIST_H__

#include<cstdio>
#include<malloc.h>
#include<assert.h>
#define SEQLIST_INIT_SIZE 8
#define INC_SIZE 3 //空间增量的大小
typedef int ElemType;
typedef struct Seqlist {
 ElemType *base;
 int capacity; //顺序表容量
 int size; //表的大小
}Seqlist;

bool Inc(Seqlist *list);//增加顺序表的容量
void InitSeqlist(Seqlist *list); //初始化顺序表
void push_back(Seqlist *list, ElemType x); //在顺序表的末尾插入元素
void push_front(Seqlist *list, ElemType x); //在顺序表的头部插入元素
void show_list(Seqlist *list); //显示顺序表中的元素
void pop_back(Seqlist *list); //删除顺序表最后一个元素
void pop_front(Seqlist *list); //删除顺序表第一个元素
void insert_pos(Seqlist *list, int pos, ElemType x);//在顺序表的选定位置上插入数据
int find(Seqlist *list, ElemType key); //在顺序表中查找元素key的下标
int length(Seqlist *list);//求顺序表的长度
void delete_pos(Seqlist *list, int pos); //删除顺序表中特定位置的数据元素
void delete_val(Seqlist *list, int key);//删除顺序表中值为key的数据元素
void sort(Seqlist *list);//冒泡排序
void reverse(Seqlist *list);//逆置顺序列表
void clear(Seqlist *list);//清除顺序表中的所有元素
void destroy(Seqlist *list);//摧毁顺序表
void merge(Seqlist *lt, Seqlist *la, Seqlist *lb);//合并两个顺序列表

#endif //__SEQLIST_H__ 

seqlist.cpp

#include"seqlist.h"

bool Inc(Seqlist *list) {
 ElemType *newbase = (ElemType*)realloc(list, sizeof(ElemType)*(list->capacity + INC_SIZE)); //重新分配内存空间
 if (newbase == NULL) {
  printf("内存空间已满,无法再分配内存空间!\n");
  return false;
 }
 list->base = newbase;
 list->capacity += INC_SIZE;
 return true;
}

void InitSeqlist(Seqlist *list) {
 list->base = (ElemType*)malloc(sizeof(ElemType)*SEQLIST_INIT_SIZE);
 assert(list->base != NULL);
 list->capacity = SEQLIST_INIT_SIZE;
 list->size = 0;
}

void push_back(Seqlist *list, ElemType x) {
 if (list->size >= list->capacity && !Inc(list)) { //Inc(list)用来判断增加顺序表容量是否成功,只有在失败的情况下才会进入if语句中
  printf("顺序表容量已满,无法再在表尾继续插入新元素!\n");
  return;
 }
 list->base[list->size] = x;
 list->size++;
}

void push_front(Seqlist *list, ElemType x) {
 if (list->size >= list->capacity && !Inc(list)) {
  printf("顺序表容量已满,无法再在表头插入新元素!\n");
  return;
 }
 for (int i = list->size;i > 0;i--) {
  list->base[i] = list->base[i - 1];
 }
 list->base[0] = x;
 list->size++;
}

void show_list(Seqlist *list) {
 for (int i = 0;i < list->size;i++) {
  printf("%d ", list->base[i]);
 }
 printf("\n");
}

void pop_back(Seqlist *list) {
 if (list->size == 0) {
  printf("顺序表已空,无法再在表尾删除元素!\n");
  return;
 }
 list->size--;
}

void pop_front(Seqlist *list) {
 if (list->size == 0) {
  printf("顺序表已空,无法再在表头删除元素!\n");
  return;
 }
 for (int i = 0;i < list->size - 1;i++) {
  list->base[i] = list->base[i + 1];
 }
 list->size--;
}

void insert_pos(Seqlist *list, int pos, ElemType x) {
 if (pos<0 || pos>list->size) {
  printf("插入位置不合法,无法插入元素!\n");
  return;
 }
 if (list->size >= list->capacity && !Inc(list)) {
  printf("顺序表容量已满,无法在插入新的元素!\n");
  return;
 }
 for (int i = list->size;i > pos;i--) {
  list->base[i] = list->base[i - 1];
 }
 list->base[pos] = x;
 list->size++;
}

int find(Seqlist *list, ElemType key) {
 for (int i = 0;i < list->size;i++) {
  if (list->base[i] == key)
   return i;
 }
 return -1;
}

int length(Seqlist *list) {
 return list->size;
}

void delete_pos(Seqlist *list, int pos) {
 if (pos < 0 || pos >= list->size) {
  printf("删除位置不合法,无法删除元素!\n");
  return;
 }
 for (int i = pos;i < list->size - 1;i++) {
  list->base[i] = list->base[i + 1];
 }
 list->size--;
}

void delete_val(Seqlist *list, int key) {
 int pos = find(list, key);
 if (pos == -1) {
  printf("顺序表中没有这个元素!\n");
  return;
 }
 delete_pos(list, pos);
}

void sort(Seqlist *list) {
 for (int i = 0;i < list->size - 1;i++) {//排序的趟数(例如5个数据需要比较4趟)
  for (int j = 0;j < list->size - 1 - i;j++) {//每一趟比较中的比较次数(例如5个数据在第0趟需要比较4次)
   if (list->base[j] > list->base[j + 1]) {
    ElemType temp = list->base[j];
    list->base[j] = list->base[j + 1];
    list->base[j + 1] = temp;
   }
  }
 }
}

void reverse(Seqlist *list) {
 if (list->size == 0 || list->size == 1) return;
 int low = 0, high = list->size - 1;
 while (low < high) {
  ElemType temp = list->base[low];
  list->base[low] = list->base[high];
  list->base[high] = temp;
  low++;
  high--;
 }
}

void clear(Seqlist *list) {
 list->size = 0;
}

void destroy(Seqlist *list) {
 free(list->base);
 list->base = NULL;
 list->capacity = 0;
 list->size = 0;
}

void merge(Seqlist *lt, Seqlist *la, Seqlist *lb) {
 lt->capacity = la->size + lb->size;
 lt->base = (ElemType*)malloc(sizeof(ElemType)*lt->capacity);
 assert(lt->base != NULL);

 int ia = 0, ib = 0, ic = 0;
 while (ia < la->size&&ib < lb->size) {
  if (la->base[ia] < lb->base[ib]) {
   lt->base[ic++] = la->base[ia++];
  }
  else {
   lt->base[ic++] = lb->base[ib++];
  }
 }
 while (ia < la->size) {
  lt->base[ic++] = la->base[ia++];
 }
 while (ib < lb->size) {
  lt->base[ic++] = lb->base[ib++];
 }
 lt->size = la->size + lb->size;
 show_list(lt);
}

main.cpp

#include"seqlist.h"

void main() {
 Seqlist list;
 InitSeqlist(&list);

 ElemType item;
 int pos;
 int select = 1;
 while (select) {
  printf("*******************************************\n");
  printf("*[1] push_back  [2] push_front *\n");
  printf("*[3] show_list  [4] pop_back  *\n");
  printf("*[5] pop_front  [6] insert_pos *\n");
  printf("*[7] find    [8] length  *\n");
  printf("*[9] delete_pos  [10] delete_value *\n");
  printf("*[11] sort    [12] reverse  *\n");
  printf("*[13] clear   [14] merge   *\n");
  printf("*[0] quit_system       *\n");
  printf("*******************************************\n");
  printf("请选择:>>");
  scanf("%d", &select);
  if (select == 0) break;
  switch (select) {
  case 1:
   printf("请输入要插入的数据(-1结束):>");
   while (scanf("%d", &item), item != -1) {//先输入item的值,只要item不等于-1就接着循环
    push_back(&list, item);
   }
   break;
  case 2:
   printf("请输入要插入的数据(-1结束):>");
   while (scanf("%d", &item), item != -1) {
    push_front(&list, item);
   }
   break;
  case 3:
   show_list(&list);
   break;
  case 4:
   pop_back(&list);
   break;
  case 5:
   pop_front(&list);
   break;
  case 6:
   printf("请输入要插入的数据:>");
   scanf("%d", &item);
   printf("请输入要插入的位置:>");
   scanf("%d", &pos);
   insert_pos(&list, pos, item);
   break;
  case 7:
   printf("请输入要查找的数据:>");
   scanf("%d", &item);
   pos = find(&list, item);
   if (pos == -1)
    printf("查找的数据元素不在顺序表中!\n");
   else
    printf("查找的数据元素在顺序表中的下标位置为%d\n", pos);
   break;
  case 8:
   printf("顺序表的长度为%d\n", length(&list));
   break;
  case 9:
   printf("请输入要删除数据在顺序表中的下标位置:>");
   scanf("%d", &pos);
   delete_pos(&list, pos);
   break;
  case 10:
   printf("请输入要删除数据的值:>");
   scanf("%d", &item);
   delete_val(&list, item);
   break;
  case 11:
   sort(&list);
   break;
  case 12:
   reverse(&list);
   break;
  case 13:
   clear(&list);
   break;
  case 14:
   Seqlist mylist, yourlist;
   ElemType item1, item2;
   InitSeqlist(&mylist);
   InitSeqlist(&yourlist);
   printf("请输入顺序表1中的元素值(-1结束):>");
   while (scanf("%d", &item1), item1 != -1) {
    push_back(&mylist, item1);
   }
   printf("请输入顺序表2中的元素值(-1结束):>");
   while (scanf("%d", &item2), item2 != -1) {
    push_back(&yourlist, item2);
   }
   merge(&list, &mylist, &yourlist);
   destroy(&mylist);
   destroy(&yourlist);
   break;
  default:
   printf("输入的选择错误!请重新输入!\n");
   break;
  }
 }
 destroy(&list);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 一文带你学习C++中的派生机制

    一文带你学习C++中的派生机制

    C++是一门面向对象的编程语言,其中的派生机制是其重要的面向对象特性之一。本文我们就来详细地学习一下C++中的派生机制的相关知识吧
    2023-04-04
  • C++实现LeetCode(123.买股票的最佳时间之三)

    C++实现LeetCode(123.买股票的最佳时间之三)

    这篇文章主要介绍了C++实现LeetCode(123.买股票的最佳时间之三),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++ TensorflowLite模型验证的过程详解

    C++ TensorflowLite模型验证的过程详解

    这篇文章给大家介绍了C++ TensorflowLite模型验证的过程,测试代码,主要是RunInference()和read_file(),详细操作过程跟随小编一起看看吧
    2021-08-08
  • 深入理解C++11:探索lambda函数的奥秘

    深入理解C++11:探索lambda函数的奥秘

    聚焦于C++11,让我们一起探索lambda函数的奥秘,本指南将带您深入了解这个强大的编程工具,让您在编程世界中如虎添翼,无论您是初学者还是有经验的开发者,本指南都将为您带来全新的视角和实用的技巧,需要的朋友可以参考下
    2024-01-01
  • 在Visual Studio Code中使用CSSComb格式化CSS文件的教程

    在Visual Studio Code中使用CSSComb格式化CSS文件的教程

    这篇文章主要介绍了在Visual Studio Code中使用CSSComb格式化CSS文件,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • C语言陷阱与缺陷之数组越界访问详解

    C语言陷阱与缺陷之数组越界访问详解

    这篇文章主要为大家详细介绍了C语言的数组越界访问,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • Qt快速读取大文件最后一行内容解决方案

    Qt快速读取大文件最后一行内容解决方案

    这篇文章主要给大家介绍了关于Qt如何快速读取大文件最后一行内容的解决方案,文中通过代码介绍的非常详细,对大家学习或者使用Qt具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • 深入内存对齐的详解

    深入内存对齐的详解

    本篇文章是对内存对齐进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 数据结构之带头结点的单链表

    数据结构之带头结点的单链表

    单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:数据域(数据元素的映象) + 指针域(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据
    2023-07-07
  • C++ Leetcode实现从英文中重建数字

    C++ Leetcode实现从英文中重建数字

    本文主要介绍了当给你一个字符串s,其中包含字母顺序打乱的用英文单词表示的若干数字(0-9)时,如何通过Leetcode按升序返回原始的数字。感兴趣的童鞋可以来看看
    2021-11-11

最新评论