C/C++语言描述,数据结构中顺序表的基本操作案例

4 篇文章 0 订阅

现在在学数据机构,对于如何操作顺序表还不够理解,所以今天就找了一些案例来实际前代码实验一下。

实际操作发现,自己对于C/C++中的传值传址的概念还不够清晰地理解,对于引用的概念不够理解,还需要再加深这方面知识的理解。

 

C++中才有引用,手动狗头。

以下代码是引用与指针的区别:

// case01.c
// Created by roohom on 2019/1/6.
// 2019/1/6 22:34

#include <stdio.h>
#include <stdlib.h>

/*关于指针何引用的区别*/

void swap1(int &a, int &b)     // 使用引用类型
{
    int temp;
    temp = a;
    a = b;
    b = temp;

}

void swap2(int a, int b)        //不使用引用类型
{
    int temp;
    temp = a;
    a = b;
    b = temp;

}

int main(){

    int x,y,a,b;
    scanf("%d%d%d%d", &x, &y, &a, &b);
    swap1(x, y);             // 引用类型改变a,b的值
    printf("  使用应用类型调用swap函数之后a,b的值:");
    printf("%d-----%d\n",x,y);
    swap2(a, b);               //不使用引用类型来改变a,b的值
    printf("不使用引用类型调用swap函数之后a,b的值:");
    printf("%d-----%d\n",a,b);
}

// 写完了编译出错查阅资料才知道C语言中没有引用,C++中才有引用  手动狗头
/*Clion编译运行出现莫名错误:*/
//D:\Clion Projects\Cream\Point_learn\case01.c:9:16: error: expected ';', ',' or ')' before '&' token
// void swap1(int &a, int &b)     // 浣跨敤寮曠敤绫诲瀷
//                ^

引用自:https://blog.csdn.net/zwxlyg/article/details/72857547的结论:

/*
结论: 
说白了引用&就是别名(你的小名,指的是同一个你),如果程序对引用做出改动,其实就是对目标的改动。 
当用执行语句trun(&a,&b)时,实参a和b的值发生了交换,如果turn函数的形参不用引用类型,
这样调用时,由于c/c++采用实参到形参的单向值传递,所以实参a和b的值并不发生任何改变
*/


 

以下是为了熟悉数据结构顺序表基本操作的代码:

// case03.cpp
// Created by roohom on 2019/1/7.
// 2019/1/7 22:02

#include <stdio.h>
#include <malloc.h>
//#include <iostream>
//using namespace std;
#define MaxSize 100

typedef struct {
    char data[MaxSize];
    int length;
} SqList;

//初始化顺序表,并将顺序表的长度设置为0
void initList(SqList *&L){
    L = (SqList *)malloc(sizeof(SqList));
    L->length=0;
}

//判断顺序表的长度
int GetLen(SqList *L){
    return (L->length);
}

void DestroyList(SqList *L)        //销毁线性表,即释放线性表所占用的内存空间
{
    free(L);
}

//尾插法在顺序表中加入数据元素
void insertElem1(SqList &L, char x){
    int i;
    for (i = GetLen(&L)-1; i < L.length; ++i) {
        L.data[i+1] = x;
    }
    ++(L.length);

}

//在指定位置插入制定数据元素,在顺序表的第p个位置插入新的元素e
int insertElem2(SqList &L, int p, char e)
{
    int i;
    if(p<0 || p > L.length || L.length==MaxSize)
    {
        return 0;
    }
    for (i = L.length-1; i >=p ; --i) {
        L.data[i+1] = L.data[i];               //先将第p个位置之后的元素挨个儿往后移动一个位置,即将前一个元素的值覆盖在后一个元素上
    }
    L.data[p] = e;                             //第p个位置的值设为e
    ++(L.length);
    return 1;
}

//输出顺序表的各个数据元素
int OutputElem(SqList *L){
    int i;
    for(i=0; i<L->length; i++)
        printf("%c", L->data[i]);
    printf("\n");
}

//按元素值查找,在顺序表中查找第一个元素值等于e的元素,并返回其下标
int findElem(SqList L, char e){
    int i;
    for(i=0; i < L.length; ++i)
    {
        if(L.data[i] == e)
            return i;
    }
    return -1;
}

//删除顺序表中下标为p的某个元素,即用后面一个元素覆盖在前一个元素上,也就是从p位置开始后面的元素挨个儿前移动一个位置
int deleteElem(SqList *&L, int p, char &e)
{
    int i;
    if(p<0 || p > L->length ){
        return 0;
    }
    e = L->data[p];
    for (i = p; i < L->length-1; i++) {
        L->data[i] = L->data[i+1];
    }
    --(L->length);
    return 1;
}

int main()   //主函数入口,开始调用和测试各个函数
{
    //首先是建立顺序表
    SqList *L;
    char e;
    printf("(1)初始化顺序表L\n");
    initList(L);
    printf("(2)使用尾插法在末尾依次插入元素a,b,c\n");
    insertElem1(*L, 'a');
    insertElem1(*L, 'b');
    insertElem1(*L, 'c');
    printf("(3)输出顺序表:\n");
    OutputElem(L);
    printf("(4)使用指定位置插入插入元素d,e,f\n");
    insertElem2(*L,0, 'd');
    insertElem2(*L,1, 'e');
    insertElem2(*L,2, 'f');
    printf("(5)输出顺序表:\n");
    OutputElem(L);
    printf("(6)顺序表中元素'c'的序号=%d\n", findElem(*L, 'c'));
    printf("(7)将第5个位置的元素删除\n");
    deleteElem(L, 5, e);
    printf("(8)现在再次输出顺序表各元素:\n");
    OutputElem(L);
    printf("(9)释放顺序表L\n");
    DestroyList(L);
}

 

GitHub:https://github.com/roohom

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值