现在在学数据机构,对于如何操作顺序表还不够理解,所以今天就找了一些案例来实际前代码实验一下。
实际操作发现,自己对于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