在现实应用中,有两种实现线性表数据元素存储功能的方法,分别是顺序存储结构和链式存储结构。顺序表操作是最简单的操作线性表的方法。下面的代码实现了顺序表的几种简单的操作。代码如下

//start from the very beginning,and to create greatness
//@author: Chuangwei Lin
//@E-mail:979951191@qq.com
//@brief: 一个顺序表的简单例子
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 10//初始化的顺序表长度
#define LISTINCREMENT 10//每次新增的长度
#define ERROR 0
#define OK 1
#define OVERFLOW -2
//顺序表容器
typedef struct{
int *elem;//表指针
int length;//表长度
int listsize;//表容量
}SqList;
/******************************************************
函数名:InitList_Sq(SqList *L)
参数:顺序表指针
功能:初始化顺序表
*******************************************************/
int InitList_Sq(SqList *L) //括号中传递参数是是它的指针L,这样才能对它指向的元素改变。
{
int i;
L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));//开辟空间
if(!L->elem) //出错
{
exit(OVERFLOW);
}
L->length =10;
L->listsize = LIST_INIT_SIZE; //分配初始的空间
for(i=0;i<L->length;i++)
{
L->elem[i]=i;//表初始化为1,2,3,4......
}
return OK;
}
/******************************************************
函数名:get_length(SqList *L)
参数:表指针
功能:获取表长
*******************************************************/
int get_length(SqList *L)
{
return L->length;
}
/******************************************************
函数名:destroy(SqList *L)
参数:表指针
功能:销毁顺序表
*******************************************************/
int destroy(SqList *L)
{
L->length=0;
return OK;
}
/******************************************************
函数名:ListInsert_Sq(SqList *L,int i, int e)
参数:表指针,插入位置,插入元素
功能:在顺序表L中的第i个位置之前插入新的元素e
*******************************************************/
int ListInsert_Sq(SqList *L,int i, int e)
{
//i的合法值为1<=i<=ListLength_Sq(L)+1;
int *newbase,*q,*p;
if(i<1||i>L->length+1)//插入位置不合法
{
return ERROR;
}
if(L->length >= L->listsize)
{// 当前的存储空间已满,增加分配
newbase = ( int *)realloc(L->elem,( L->listsize +LISTINCREMENT)*sizeof(int));
if(!newbase)
{
exit(OVERFLOW) ; //存储空间分配失败
}
L->elem = newbase;//更新基址地址
L->listsize+=LISTINCREMENT;//增加表容量
}
q=&(L->elem[i-1]);//从q位置开始后面的元素都应该要后移
for(p=&(L->elem[L->length-1]);p>=q;--p) //从最后一个元素开始后移才不会覆盖
{
*(p+1)=*p; //插入位置及之后的元素右移
}
*q=e;//插入元素
++L->length;//更新表长度
return OK;
}
/******************************************************
函数名:ListDelete_Sq(SqList *L, int i, int* e)
参数:表指针,位置,返回值
功能:在顺序线性表L中删除第i个元素,并用e返回其值
*******************************************************/
int ListDelete_Sq(SqList *L, int i, int* e)
{
// i的合法值为1≤i≤ListLength_Sq(L)。
int *p, *q;
if (i<1 || i>L->length)
{
return ERROR; // i值不合法
}
p = &(L->elem[i-1]);// p为被删除元素的位置
*e = *p;// 被删除元素的值赋给e
q = L->elem+L->length-1;// 表尾元素的位置
for (++p; p<=q; ++p)//从p位置开始移动
{
*(p-1) = *p;// 被删除元素之后的元素左移
}
--L->length; // 表长减1
return OK;
}
/******************************************************
函数名:display_all(SqList *L)
参数:表指针
功能:列出所有表元素
*******************************************************/
int display_all(SqList *L)
{
int i;
for(i=0;i<L->length;i++)
{
printf("%d ",L->elem[i]);//打印表元素
}
printf("\n");
return OK;
}
/******************************************************
函数名:search_by_num(SqList *L,int i)
参数:表指针,查找序号
功能:按序号查找
*******************************************************/
int search_by_num(SqList *L,int i)
{
if (i<1 || i>L->length)
{
return ERROR; // i值不合法
}
printf("你查找的是第%d个值,内容为%d\n",i,L->elem[i-1]);
}
/******************************************************
函数名:search_by_value(SqList *L,int value)
参数:表指针,查找的值
功能:按元素查找
*******************************************************/
int search_by_value(SqList *L,int value)
{
int i,j=0;//j作为找到的标志
for(i=0;i<L->length;i++)
{
if (L->elem[i] == value)
{
j = 1;
printf("你要找的元素找到啦!%d在第%d个\n",value,i+1);
}
}
if (j == 0)
{
printf("你要的元素找不到\n");
}
return 0;
}
/******************************************************
函数名:
参数:
功能:主函数
*******************************************************/
int main()
{
SqList L;
int get,e=0;
int i,num;
InitList_Sq(&L);//初始化顺序表
do{
printf("请输入你要进行的操作序号\n");
printf("1.线性表置空\n");
printf("2.求线性表长度\n");
printf("3.数据元素的插入操作\n");
printf("4.数据元素的删除操作\n");
printf("5.显示线性表中的全部元素\n");
printf("6.按序号查找\n");
printf("7.按元素的值查找\n");
printf("8.退出\n");
scanf("%d",&get);
switch(get)
{
case 1:
destroy(&L);//将顺序表置空,只需要将其长度置零
break;
case 2:
printf("该线性表的长度是%d\n",get_length(&L)); //求取线性表的长度
break;
case 3:
//在指定的位置上插入指定的数据元素
printf("请输入你要插入的元素的位置(即在第i个元素之前插入)以及插入元素\n");
scanf("%d,%d",&i,&num);
ListInsert_Sq(&L,i,num);
printf("新的线性表是\n");
display_all(&L);
break;
case 4:
//删除指定位置的数据元素
printf("请输入你要删除的元素的位置(即删除第i个元素)\n");
scanf("%d",&i);
ListDelete_Sq(&L,i,&e);//要传进去e的地址才能得到值
printf("删除的元素为%d\n",e);
printf("新的线性表是\n");
display_all(&L);
break;
case 5:
//显示线性表的所有元素
display_all(&L);
break;
case 6:
//按序号查找
printf("输入您要查找元素的序号\n");
scanf("%d",&i);
search_by_num(&L,i);
break;
case 7:
//按值查找
printf("输入您要查找的元素的值\n");
scanf("%d",&num);
search_by_value(&L,num);
case 8:
//退出程序
break;
default:
printf("选取范围为1到8,请重新输入\n");
break;
}
}while(get!=8);
return OK;
}

运行结果:

顺序表的C语言实现的更多相关文章

  1. 【数据结构】之顺序表(Java语言描述)

    之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...

  2. 【数据结构】之顺序表(C语言描述)

    顺序表是线性表的一种,它将元素存储在一段连续的内存空间中,表中的任意元素都可以通过下标快速的获取到,因此,顺序表适合查询操作频繁的场景,而不适合增删操作频繁的场景. 下面是使用 C语言 编写的顺序表的 ...

  3. 顺序表栈C语言实现

    /* * SeqStack.h * * Created on: 2019年8月1日 * Author: Administrator */ #ifndef SEQSTACK_H_ #define SEQ ...

  4. 五种编程语言解释数据结构与算法——顺序表1(理论与C语言实现)

    1.线性表的分类 2.线性表的定义及其基本操作 2.1.定义:线性表是具有相同类型的n(n>=0)个元素的有序序列,其中n为表长,当n=0时,该表为空表. 2.3.线性表的逻辑结构为: 2.4. ...

  5. C语言实现顺序表(顺序存储结构)

    顺序表(顺序存储结构)及初始化过程详解 顺序表,全名顺序存储结构,是线性表的一种.通过<线性表>一节的学习我们知道,线性表用于存储逻辑关系为"一对一"的数据,顺序表自然 ...

  6. 顺序表 C++ 类模板实现

    顺序表的C++语言描述 基本运算的算法——置空表.求表的长度.取结点.定位运算.插入运算.删除运算.建立顺序表.输出顺序表 #include <iostream>using namespa ...

  7. 数据结构C语言版--动态顺序表的基本功能实现(二)

    /* * 若各个方法结构体变量参数为: &L(即地址符加变量)则结构体变量访问结构成员变量时使用"." * 若为:*L(即取地址符加变量)则结构体变量访问结构体成员变量使用 ...

  8. C语言实现顺序表

    C语言实现顺序表代码 文件SeqList.cpp #pragma warning(disable: 4715) #include"SeqList.h" void ShowSeqLi ...

  9. 数据结构与算法之顺序表C语言实现

    顺序表等相关概念请自行查阅资料,这里主要是实现. 注: 1.顺序表C语言实现: 2.按较简单的方式实现,主要帮助理解,可在此基础上修改,更加完善: 3.提供几个简单函数,可自行添加功能: 4.可用C+ ...

随机推荐

  1. tf.nn.sigmoid_cross_entropy_with_logits 分类

    tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,,labels=None,logits=None,name=None) logits和la ...

  2. Web开发与设计之Google兵器谱-Web开发与设计利器

    Web开发与设计之Google兵器谱-Web开发与设计利器 博客分类: Java综合 WebGoogleAjaxChromeGWT 笔者是个Java爱好者也是用Java进行web开发的工作者.平时笔者 ...

  3. RNN循环神经网络(Recurrent Neural Network)学习

    一.RNN简介 1.)什么是RNN? RNN是一种特殊的神经网络结构,考虑前一时刻的输入,且赋予了网络对前面的内容的一种'记忆'功能. 2.)RNN可以解决什么问题? 时间先后顺序的问题都可以使用RN ...

  4. IE各版本CSS Hack(兼容性处理)语法速查表

    为了兼容IE各个版本,需要在CSS中添加额外的代码,比如以前常用的_width.之所以工作,是因为浏览器会忽略不能解析的样式规则,因此举个例子来说,把_width写在width下面,对于非IE浏览器会 ...

  5. 怎么用python 3 开发钉钉群机器人

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Python绿色通道 PS:如有需要Python学习资料的小伙伴可以加 ...

  6. Atcoder E - Crested Ibis vs Monster、

    一看到题目就觉得是一个背包问题,但是不知道怎么写. 题解:直接求背包容量为2*h时所需要的花费.然后h~2h都是满足条件的,去最小值即可. code: #include<bits/stdc++. ...

  7. Windows DC域控由server08r2升级至server2016测试

    测试环境 原DC: csctest.com CSCDC01 192.168.100.1 server08r2 CSCDC02 192.168.100.2 server08r2 要求: 原两台旧主机均更 ...

  8. leetcode-0617 合并二叉树

    题目地址https://leetcode-cn.com/problems/merge-two-binary-trees/ 1.递归解法 递归的话我们首先需要递归的终止条件,对于本题而言,递归的终止条件 ...

  9. python数据分析工具——Pandas、StatsModels、Scikit-Learn

    Pandas Pandas是 Python下最强大的数据分析和探索工具.它包含高级的数据结构和精巧的工具,使得在 Python中处理数据非常快速和简单. Pandas构建在 Numpy之上,它使得以 ...

  10. Java 多线程 -- volatile 山寨版的synchronized

    在 多线程中,每个线程会把数据从主内存中拷贝到自己的工作内存中,当线程完成计算后,再把工作内存的数据更新到主内存中,或者当主内存主数据有更新是,线程会去主内存取最新数据.但是,当线程特别忙时,就不会去 ...