数据结构:线性表的基本操作

顺序表学习:参考《大话数据结构》

涉及到顺序表的基本操作有如下:

int initList(SqList *L);               /** 初始化操作,建立一个空的线性表 **/
int printList(SqList L);                 /** 打印线性表中的每一个元素 **/
int getlength(SqList L);               /** 返回线性表元素的个数 **/
int createList(SqList *L,int length);         /** 创建一个链表长度为length的线性表 **/
int insertList(SqList *L, int pos,ElemType elem);   /** 在线性表的第pos个位置插入 一个新元素elem **/
int getElem(SqList L, int pos, ElemType *e);     /** 将线性表中第pos个位置的元素返回,保存在*e中 **/
int locateElem(SqList L, ElemType e);       /** 在线性表中查找与给定元素e相等的元素,如果有相同的返回状态值1,如果没有,返回状态值0 **/
int deleteList(SqList *L, int pos,ElemType *elem);   /** 从线性表中删除pos位置处的元素,并将其存放在elem中; **/
int clearList(SqList L,SqList *pL);          /** 清空顺序表 **/
(一)ADT

1 typedef int ElemType;
2 typedef  struct{   // 线性表中共有length个元素,是data[0]——data[length-1]
3         int data[MAXSIZE];
4         int length;
5 }SqList;

(二)初始化一个顺序表

1 int initList(SqList *L)
2 {
3     L->length=0;
4     return 1;
5 }

(三)打印一个顺序表,方便测试操作结果是否正确

 1 int printList(SqList L)
 2 {
 3     if(L.length==0)
 4     {   printf("链表为空\n");
 5         return 0;
 6     }
 7     int i;
 8     for(i=0;i<L.length;i++){
 9         printf("data[%d] = %d\n",i,L.data[i]);
10     }
11     printf("\n");
12     return 1;
13 }

(四)获取顺序表的长度

1 int getlength(SqList L){
2     return L.length;
3 }

(五)创建一个顺序表,每个元素的值随机赋值

1 int createList(SqList *L,int length){
2     srand(time(0));
3     int i;
4     for(i=0;i<length;i++){
5         L->data[i]=rand()%100;
6         L->length++;
7     }
8     return 1;
9 }

(六)在指定位置处插入一个新的元素

 1 int insertList(SqList *L, int pos,ElemType elem){
 2     int i;
 3     if(pos<1 || pos>L->length)
 4     {
 5         printf("插入的位置有误,无法插入数据\n");
 6         return 0;
 7     }
 8     for (i=L->length-1;i>=pos-1;i--)
 9     {
10         L->data[i+1]=L->data[i];
11     }
12     L->data[pos-1] = elem;
13     L->length++;
14     return 1;
15 }

(七)获取顺序表中指定位置处的元素值

 1 int getElem(SqList L, int pos, ElemType *e){
 2     if(pos<1 || pos>L.length)
 3     {
 4         printf("查找位置有错误,无法获取指定位置的数据\n");
 5         *e=99999999;
 6         return 0;
 7     }
 8     *e = L.data[pos-1];
 9     return 1;
10 }

(八)查找在线性表中是否含有指定元素

 1 int locateElem(SqList L, ElemType e){
 2     int i;
 3     for(i=0;i<L.length;i++)
 4     {
 5         //printf("在%d层循环...\n",i);
 6         if(L.data[i] == e)
 7         {
 8             printf("在pos[%d]位置处,查找到了元素elem:%d\n",i+1,e);
 9             return 1;
10         }
11     }
12     return 0;
13 }

(九)删除顺序表中指定位置处的元素

 1 int deleteList(SqList *L, int pos,ElemType *elem){
 2     int i;
 3     if(pos<1 || pos>L->length)
 4     {
 5         printf("删除的位置有误,无法从该位置删除数据\n");
 6         *elem=99999999;
 7         return 0;
 8     }
 9     *elem = L->data[pos-1];
10     for(i=pos;i<L->length;i++){
11         L->data[i-1]=L->data[i];
12     }
13     L->length --;
14     return 1;
15 }

(十)清空一个顺序表,将顺序表的length置为0;

1 int clearList(SqList L,SqList *pL){
2     printf("In clearList function: %d\n",&L);
3     printf("In clearList function: %d\n",pL);
4     L.length=0;
5     pL->length=0;
6     return 1;
7 }

说明:

1、在上面顺序表操作函数中,有的入参是SqList类型的,有的是SqList*类型的,两者是有区别的,通过clearList()函数进行说明;

2、入参有两种类型,这是为了测试在函数内部,处理的顺序表在内存中的位置是什么,在函数内部,会把顺序表的位置以%d的方式打印出来;同时在调用函数之前,会把传入的入参顺序表L的地址打印出来;

通过测试发现,如果入参为SqList L,在函数内部地址同外部的顺序表L地址不相同,如果入参为SqList *pL,在函数内部地址同外部的顺序表L地址相同;当入参为SqList L时,执行L.length=0;无效,根本没有将顺序表的唱的长度置为0;

3、综上所述,如果要修改顺序表中的值(包括长度,以及各个元素的值),比如创建顺序表、插入元素、删除元素等等操作,是对顺序表内的数据有改动的,就要传入SqList *类型的入参,否则达不到修改的目的;【这其实就是函数的值传递和地址传递】

时间: 2024-10-11 00:42:46

数据结构:线性表的基本操作的相关文章

数据结构中线性表的基本操作-合并两个线性表-依照元素升序排列

#include<iostream> #include<stdlib.h> #define LIST_INIT_SIZE 10/*线性表初始长度*/ #define LIST_CREATENT 2/*每次的增量*/ typedef int ElemType; using namespace std; typedef struct SqList/*线性表的数据结构定义*/ { ElemType *elem;/*线性表基址*/ int length;/*当前线性表所含的元素个数*/ i

数据结构中线性表的基本操作-合并两个线性表

#include<iostream> #include<stdlib.h> #define LIST_INIT_SIZE 10/*线性表初始长度*/ #define LIST_CREATENT 2/*每次的增量*/ typedef int ElemType; using namespace std; typedef struct SqList/*线性表的数据结构定义*/ { ElemType *elem;/*线性表基址*/ int length;/*当前线性表所含的元素个数*/ i

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

[考研系列之数据结构]线性表之栈

?基本概念 栈的定义 限定仅在表尾进行插入或删除的线性表 组成 栈顶 栈底 基本操作 入栈(PUSH) 往栈中插入一个元素 弹栈(POP) 从栈顶删除一个元素 栈的表示 顺序栈 链栈 对于顺序栈,有两个指针base和top base指向栈底 top指向栈顶 对于栈的一些基本情况: 栈不存在时候 base=NULL 栈为空时  top=base 栈的长度 top-base 链栈略过. 栈的应用 1 数制转换 数制转换我们使用一种称之为"辗转相除法"的算法.此算法的基本原理基于: N=(N

数据结构——线性表

提示:以下内容不适合零基础人员,仅供笔者复习之用. 一.线性结构的基本特征: 1.集合中必存在唯一的一个"第一元素": 2.集合中必存在唯一的一个 "最后元素": 3.除最后元素在外,均有 唯一的后继: 4.除第一元素之外,均有 唯一的前驱. 如:java中的List接口,就是线性表.ArrayList就是顺序线性表,LinkedList就是链表线性表. 二.线性表的基本操作: 1.InitList(*L): 初始化操作,建立一个空的线性表L. 2.ListEmpt

浅谈线性表的基本操作与应用

线性表作为一种线性数据结构,常应用于信息检索,存储管理等诸多领域,因此了解线性表的基本操作与应用对于我们学习数据结构有着十分重要的意义. 一,线性表的基本操作 首先,我们定义一个线性表的基类linearlist,并以此定义了它的派生类顺序表类seqlist和链表类singlelist.在基类中,我们以抽象函数的形式定义了线性表常用的几种操作,如插入删除等. #ifndef LINEARLIST_H_INCLUDED #define LINEARLIST_H_INCLUDED #include<i

Problem O: 线性表的基本操作

#include <iostream> #include <iomanip> #include <map> #include <string> #include <list> using namespace std; class MyList { public : list<int> elements; int len; int curLen; MyList(int _len):len(_len){} void append(int

顺序存储的线性表的基本操作

刚开始学数据结构,几乎算是什么都不会,想记录一下学习的东西,所以就学别人开始写博客. 刚学了顺序存储的线性表的基本操作,把操作写了一遍.可能会有错误. 顺序存储的线性表,用结构体类型.注意:结构体并不是用来存储元素的,elem才是存储元素的首地址 1 typedef struct 2 { 3 ElemType *elem;//存储空间基地址 6 int length;//表长 7 int listsize;//表容量 8 }SqList; 初始化:构造空表L,返回一个状态,需要带回一个表给基地址

数据结构-线性表_顺序表

进入大学一年了,今日终于有勇气写写随笔并展示出来了. 如有不足之处,请大家指正. 今日我想写的就是我对数据结构-线性表_顺序表的理解. 不BB了,进入正题!!!!! 数据结构中的逻辑结构分为线性结构和非线性结构,而线性表就属于线性结构. 线性结构是 n 个数据元素的有序(次序)集合,它有下列几个特征: 集合中必存在唯一的一个 "第一个元素": 集合中必存在唯一的一个 "最后的元素": 除最后元素之外,其它数据元素均有唯一的 "后继": 除第一元素

[考研系列之数据结构]线性表之队列

基本概念 队列的定义 队列是一种只能在表的一头插入,另一头删除的线性表,简而言之具有FIFO的特性 组成 队头 队尾 扩展 双端队列 只能在两端进行删除插入操作的线性表 实现 链队列 顺序队列 循环队列 循环队列 循环队列是将顺序队列臆造成一个环,如图 循环队列有以下参数 front 指向队头的指针 rear 指向队尾的指针 SIZE 循环最大队列长度 对于循环队列,初始状态的时候 front=rear=0; 每次insert的时候 Insert((front++)%SIZE); 那么,当循环队