数据结构与算法基础(王卓)(3)
创始人
2024-03-08 16:33:45
0

前置:

//#include
#include//存放exit#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE  -1
#define OVERFLOW   -2   #define MAXlength 100  //初始大小为100,可按需修改typedef int Status;         //函数调用状态struct Poly
{float p;int e;
};struct Sqlist
{Poly* elem;int length;
};

二、线性表的销毁

void DestroyList(Sqlist& L)
{if (L.elem) delete L.elem;
}

三、线性表的清空

void CLearList(SqList &L)
{L.length = 0;
//将线性表的长度设置为0
}

四、线性表是否为空 

int IsEmpty(Sqlist L)
{if (L.length == 0)return true;elsereturn false;
}

五、返回线性表元素个数

int Listlength(Sqlist L)
{return L.length;
}

、返回线性表第i个元素值

int GetElem(Sqlist L,int i,Poly ele)//element:元素
{
    if (i <= 0 || i > L.length)
        return ERROR;
        ele = L.elem[i-1];
        return OK;
}

int GetElem(Sqlist L,int i,Poly ele)//element:元素
{if (i <= 0 || i > L.length)return ERROR;ele = L.elem[i-1];return OK;
}

或者:

bool GetELem(const SqList &L, const size_t i, ElemType &e)
{if(i<1 || i>MAXSIZE){cerr<<"out of range"<

 ele = L.elem[i-1]:

elem是结构体Sqlist里面的一个指针(型)变量成员,指向一个Ploy类型的目标变量

也就是说,其本身就是这个类型的对象的首地址,至于剩下的,就不用我多说了吧

如果还要我说,那就详见:C语言日记 25 指针与数组_宇 -Yu的博客-CSDN博客

这个(以上)算法的复杂度都为常量阶O(1)

顺序表可以随机存取(只要进行一次赋值操作,想要哪个都可以)这是其非常大的优点

比如链表就没有(不能实现)这样的功能

重难点算法:(算法时间复杂度:O(n)

七、查找元素

project1:

int LocateElem(Sqlist L, Poly i)
{int a;for (a = 0; L.elem[a] != i; a++);cout << "元素序号:  " << a << endl;// cout<<}

注意,我们要的,是把所有符合条件的元素筛选出来,而不是只选取第一个:

project2:

int LocateElem(Sqlist L, Poly i)
{for (int a = 0; a <= L.length; a++){if (i == L.elem[a])return a + 1;return 0;}
}

可结果却显示:

 为什么??? 

完整代码:

#include
#include//OVERFLOW,exit
#define OK          1
struct Poly
{float p;int e;
};struct Sqlist
{Poly* elem;int length;
};int LocateElem(Sqlist L, Poly i)
{for (int a = 0; a <= L.length; a++){if (i == L.elem[a])return a + 1;return 0;}
}

原因不在我写的操作函数里,而是在前面的类体当中;

究其根本原因,还是因为:==不能直接比较结构体,需要手撸比较的工具:

    bool operator==(Poly& t) 
    {
        return t.p == p && t.e == e;
    }

project 3:

#include//OVERFLOW,exit
#define OK          1
struct Poly
{float p;int e;bool operator==(Poly& t) {return t.p == p && t.e == e;}
};struct Sqlist
{Poly *elem;int length;
};int LocateElem(Sqlist L, Poly i)
{for (int a = 0; a <= L.length; a++){if (i == L.elem[a])return a + 1;return 0;}
}
int main()
{}

 用while语句实现:

#include
#include//OVERFLOW,exit
#define OK          1
struct Poly
{float p;int e;bool operator==(Poly& t){    return t.p == p || t.e == e;   }bool operator!=(Poly& t){return t.p != p && t.e != e;}
};struct Sqlist
{Poly* elem;int length;
};int LocateElem(Sqlist L, Poly i)
{int a = 0;while (a <= L.length && i != L.elem[a])a++;if(a <= L.length)return a + 1;return 0;
}
int main()
{}

八、线性表的插入

project 1:

int ListInsert(Sqlist L,int i,Poly e)
{//insert:插入//i:插入位置(位置序号)if (i<1 || i>L.length + 1)return ERROR;//把插入位置后面的元素全部往后移for (int j = L.length - 1; j >= i - 1; j--)//j为下标L.elem[j + 1] = L.elem[j];//放元素L.elem[i-1] =  e;return 0;
}

记得(别忘了)写:

    if (L.length == MAXlength)return ERROR;

    L.length++;

project 2:

int ListInsert(Sqlist L,int i,Poly e)
{//insert:插入//i:插入位置(位置序号)
    if (i<1 || i>L.length + 1)
        return ERROR;
    if (L.length == MAXlength)return ERROR;//当前储存空间已满
    //把插入位置后面的元素全部往后移
    for (int j = L.length - 1; j >= i - 1; j--)//j为下标
        L.elem[j + 1] = L.elem[j];
    //放元素
    L.elem[i-1] =  e;
    L.length++;
    return 0;
}

//#include
#include//存放exit#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE  -1
#define OVERFLOW   -2   #define MAXlength 100  //初始大小为100,可按需修改typedef int Status;         //函数调用状态struct Poly
{float p;int e;
};struct Sqlist
{Poly* elem;int length;
};int ListInsert(Sqlist L,int i,Poly e)
{//insert:插入//i:插入位置(位置序号)if (i<1 || i>L.length + 1)return ERROR;if (L.length == MAXlength)return ERROR;//把插入位置后面的元素全部往后移for (int j = L.length - 1; j >= i - 1; j--)//j为下标L.elem[j + 1] = L.elem[j];//放元素L.elem[i-1] =  e;L.length++;return 0;
}
int main()
{}

注意:

i:位序;不是下标

j:数组下标(用于访问数据)

L.length:总的元素个数,i的最大值

九、线性表的删除

int ListDelete(Sqlist L,int i)
{if (i < 1 || i > L.length )return ERROR;for (int j = i - 1; j <= L.length-1; j++)L.elem[j] = L.elem[j + 1];L.length--;
}

按照书上的写法:(不要忘了:    return OK;)

int ListDelete(Sqlist L,int i)
{if (i < 1 || i > L.length )return ERROR;for (int j = i ; j <= L.length; j++)L.elem[j-1] = L.elem[j];L.length--;return OK;
}
bool EraseList(Sqlist &L, const int &i)
{//异常判断if(i<0 || i>L.length){cerr << "wrong erase position!" << endl;return false;}if(L.length == 0){cerr << "List has no length" << endl;return false;}//将位于删除位置之后的元素依次向前挪动一位for (int p = i + 1; p < L.length; ++p){L.elem[p - 1] = L.elem[p];}//线性表长度-1L.length -= 1;return true;//算法时间复杂度:O(n)
}

有关于线性表的所有基本操作到此为止,完结撒花

下一节,我们开关于链表的学习 

相关内容

热门资讯

法援志愿行 (来源:南京晨报) 转自:南京晨报 记者12月23日从司法部获悉,司法部、教育部、共青团中央印发通知...
一审胜诉!ST新亚无需承担大额... 12月24日,ST新亚(002388)发布公告,披露公司及控股子公司、上海分公司涉及的一起大额款项支...
178件地方性法规为首都发展提... 12月24日,北京市人民政府新闻办公室召开首都“十四五”规划高质量收官系列主题新闻发布会,市委依法治...
5起医疗损害责任纠纷典型案例发... 医疗卫生事业与广大人民群众的生活息息相关,和谐医患关系事关社会稳定。近年来,全省法院进一步加强医疗纠...
委内瑞拉通过法案:扣押油轮是犯... 参考消息网12月24日报道据美联社12月23日报道,委内瑞拉议会23日批准一项法案,将妨碍该国航运和...
天风证券融资净偿还55.63万... 雷达财经雷助吧出品 文|林宜采 编|深海 东财Choice金融数据显示,12月23日,天风证券当日融...
央行:建议发挥增量政策和存量政... 中国人民 银行货币政策委员会2025年第四季度(总第111次)例会于12月18日召开。会议研究了下阶...
反洗钱工作部际联席会议:保持对... 2025年12月24日,反洗钱工作部际联席会议第十二次全体会议召开。 会议认为,第十一次反洗钱工作部...
加大总量管理制度经验推广,深圳... 从允许做升级为主动推广和深化,出台13年后,深圳的合格境外有限合伙人境内投资制度,将迎来更大的调整完...
药易购:收到合同纠纷案件执行款... 四川合纵药易购医药股份有限公司近日收到与杨亚、曹继军、享健药易购健康科技有限公司合同纠纷一案的执行款...