1.数据结构,顺序表算法实现
#include <stdio.h> #include <stdlib.h> #define INIT_SIZE 100 #define INCRE_SIZE 10 typedef int ElemType; typedef struct SqList //1.顺序表的动态存储 { ElemType *pList; int length;//表长 int listsize;//顺序表大小 } SqList; void initial(SqList &L) //初始化链表 { L.pList = (int *)malloc(sizeof(int) * INIT_SIZE); L.length = 0 ; L.listsize = 100; } void deleteIthELem(SqList &L,int ith,int &e) //2.删除第ith个元素 { if(ith <= L.length) { e = L.pList[ith-1]; for(int curIndex = ith; curIndex < L.length; curIndex++) { L.pList[curIndex-1] = L.pList[curIndex]; } } --L.length; printf("deleted elem is %d\n",e); } void insert(SqList &L,int ith,int elem) //3.在第i个元素前插入e { if(ith>=1 && ith<=L.length && L.length<L.listsize) //判断插入合法性 { for(int i = L.length; i>=ith; i--) { L.pList[i] = L.pList[i-1]; } L.pList[ith-1]= elem; //插入元素 } printf("insert completed!\n"); printf("insert elem is %d\n",L.pList[ith-1]); L.length++; } void test(SqList &L) //赋值用来测试 { printf("顺序表初始化:"); for(int i =0; i<5; i++) { L.pList[i] = i; // printf("%d",L.pList[i]); } for(int i =9; i>=5; i--) { L.pList[i] = 10-i; // printf("%d",L.pList[i]); } for(int i =0;i<10;i++){ printf("%d ",L.pList[i]); } printf("\n"); L.length = 10; } void view(SqList L){ printf("\nview:"); for(int i=0;i<L.length;i++){ printf("%d ",L.pList[i]); } printf("\n"); } void delMinElem(SqList &L) //4.删除最小元素 { int minIndex = 0; //记录最小节点元素的索引 for(int i =1; i<L.length; i++) { if(L.pList[i]<L.pList[minIndex]) { minIndex = i; } } printf("最小元素的索引为:%d\n",minIndex); L.pList[minIndex] = L.pList[L.length-1]; L.length--; } void deleteElems_t(int s,int t,SqList &L) //5.删除元素值s_t之间的元素 { int curLength = 0; for(int curindex = 0 ; curindex<L.length; curindex++) { int e = L.pList[curindex]; if(e<s || e>t) //直接在原顺序表的位置进行操作 { L.pList[curLength] = e; ++curLength; //也可以单独开空间进行操作 } } L.length = curLength; } /*6. 在非递减的顺序表中删除[s,t]的元素 思路:先从前往后找最后一个小于s的元素 再从后往前找第一个大于t的元素 */ void deleteElems_t2(int s,int t,SqList &L) { int curLength = 0; int curIndex = 0; while(curIndex<L.length) { if(L.pList[curIndex] >= s) { break; //找到第一个>=s的元素 } curIndex++; } curLength = curIndex;//更新表长 curIndex = L.length - 1; while(curIndex >=0) { if(L.pList[curIndex] <= t) { break; } curIndex--; } ++curIndex;//指向第一个大于t的元素 while(curIndex < L.length) { L.pList[curLength] = L.pList[curIndex]; ++curIndex; ++curLength; } L.length = curLength; //最后更新表长 } /*7.删除非递减顺序表中的重复元素*/ void deleteElems_t3(SqList &L) { int curLength = 0; for(int i = 0; i<L.length; i++) { int e = L.pList[i]; if(curLength == 0) { L.pList[curLength] = e;//新表中无元素时直接追加 curLength++; } if(e != L.pList[curLength-1]) //与新表表尾元素不同, { L.pList[curLength] = e; curLength ++; } } L.length = curLength; } /*8.合并两个顺序表,A是升序,B是降序,两个 个表中都不存在相同的元素 A表中有 m个元素,B表中有 n个元素 */ //8.1 两个表和并存在C中(单独开m+n个存储空间) void combine_to_c(SqList &La,SqList &Lb,SqList &Lc) { Lc.length = La.length + Lb.length; //合并后的新表长度 //申请Lc.length 个长度存储单元,并用p指向 Lc.pList = (int *)malloc(sizeof(int)*Lc.length); int curLength = 0;//新表中的元素 int IndexLa = 0; //指向A表第一个元素 int IndexLb = Lb.length -1 ;//指向B表最后一个元素 while(IndexLa<La.length && IndexLb >= 0 ){ if(La.pList[IndexLa] < Lb.pList[IndexLb]){ //La中的元素更小,追加到新表 Lc.pList[curLength] = La.pList[IndexLa]; curLength++; IndexLa++;//指向下一个元素 }else{ Lc.pList[curLength] = Lb.pList[IndexLb]; curLength++; IndexLb--; } } //如果A表中还有剩余元素,则说明B表中最大的元素都比 //此时A表中最小的元素小,所以直接将A表中剩余元素插入即可 while(IndexLa < La.length){ Lc.pList[curLength] = La.pList[IndexLa]; IndexLa ++; curLength++; } //如果B表还有剩余则说明B表中,此时最小的元素都比A表最大的元素大 //所以直接插入即可 while(IndexLb < Lb.length){ Lc.pList[curLength] = Lb.pList[IndexLb]; curLength++; IndexLb--; } //此时合并完成,释放掉A和B两个表中的存储空间 free(La.pList); La.length = 0; La.pList =0; free(Lb.pList); Lb.length = 0; Lb.listsize =0 ; } //8.2 A表中有m+n个存储空间,合并到A表中 void combine_to_A(SqList &La,SqList &Lb) { int curLength = 0;//新表表长 int IndexLa = La.length-1;//指向A表中最大元素 int IndexLb = 0;//指向B表中最大元素 while(IndexLa>=0 && IndexLb < Lb.length){ if(La.pList[IndexLa] > Lb.pList[IndexLb]){ La.pList[La.listsize-curLength-1] = La.pList[IndexLa]; curLength++; IndexLa--; }else{ La.pList[La.listsize-curLength-1] = La.pList[IndexLb]; curLength++; IndexLb++; } } //如果A表中还有元素剩余 if(IndexLa >=0 ){ La.pList[La.listsize-curLength-1] = La.pList[IndexLa]; ++curLength; --IndexLa; } //如果B表中还有元素剩余 if(IndexLb < Lb.length){ La.pList[La.listsize-curLength-1] = Lb.pList[IndexLb]; ++curLength; ++IndexLb; } //更新表长 La.length = curLength; Lb.length = 0; } //8.3 A表中前r个元素递增,后面n-r个元素递减,使A递增 void sort_BA(SqList &La,int k) { int curIndex = k;//指向第k个元素,降序的第一个元素 while(curIndex < La.length){ int e = La.pList[curIndex]; //保存待插入值 int i = curIndex - 1; while(i>=0 && La.pList[i] > e){ La.pList[i+1] = La.pList[i]; --i; }//找到待插入位置 La.pList[i+1] = e; ++curIndex;//指向下一个待插入元素 } } //9.两个升序的非空集合,按照顺序表的方式存储,求交集 //同一个序列中无相同元素,因为是集合(理解) void intersect(SqList &La,SqList &Lb){ int curLength = 0 ;//记录新表长度 int IndexLa = 0; int IndexLb = 0; while(IndexLa < La.length && IndexLb < Lb.length){ if(La.pList[IndexLa] < Lb.pList[IndexLb]){ IndexLa ++; }else if(Lb.pList[IndexLb] < La.pList[IndexLa]){ IndexLb ++; }else{//有相同元素,将新元素追加到表尾 La.pList[curLength] = La.pList[IndexLa]; curLength++; IndexLa++; IndexLb++; } } La.length = curLength; } //10.两个非空集合,分别按照顺序表升序的方式进行存储 //A-B 差集 void except(SqList &La,SqList &Lb) { int curLength = 0; int IndexLa =0; int IndexLb = 0; while(IndexLa < La.length && IndexLb < Lb.length) { if(La.pList[IndexLa] < Lb.pList[IndexLb]){ La.pList[curLength] = La.pList[IndexLa]; curLength++; IndexLa++; }else if(La.pList[IndexLa]> Lb.pList[IndexLb]){ IndexLb++; }else{//两者相等的情况 IndexLa++; IndexLb++; } } La.length = curLength;//更新表长 } //11.设计算法逆置顺序表L /* 分析: 用两个指针分别从两个方向开始扫描 交换后,再分别下移一个位置,最终完成扫描 */ void reverse(SqList &Lm,int low,int high) { int low = 0;//整个逆置 int high = L.length-1; while(low<high){ int e = L.pList[high]; L.pList[high] = L.pList[low]; L.pList[low] = e; low++; high--; } } //12.将序列L循环左移动r(重点,记忆,四颗星) void ROL(SqList &L,int r){ reverse(L,0,L.length-1); reverse(L,0,L.length-1-r); reverse(L,L.length-r,L.length-1); } int main() { SqList s;//创建顺序表 initial(s); //进行初始化 test(s); int x; deleteIthELem(s,3,x); insert(s,3,x); delMinElem(s); test(s); deleteElems_t3(s);//删除重复元素 view(s); test(s); sort_BA(s,5); view(s); return 0; }
__EOF__
本文作者:DeepBrainBoy
本文链接:https://www.cnblogs.com/tccjx/p/17657512.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/tccjx/p/17657512.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文来自博客园,作者:TCcjx,转载请注明原文链接:https://www.cnblogs.com/tccjx/p/17657512.html
分类:
考研数据结构和c语言
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App