数据结构实验(三)线性表的操作与应用

1|06-1 顺序表实现


int ListLength(SqList L){ return L.length; } int LocateElem(SqList L , ElemType e , Status (*compare)(ElemType , ElemType) ){ // 虽然说i的范围是从[1,n],但是实际上在内存的中的位置是[elem,elem+n-1] // 所以要从0开始遍历 for( int i = 0 ; i < L.length ; i ++ ) if( compare( L.elem[i] , e ) ) return i+1; return 0; } Status ListInsert( SqList &L , int i , ElemType e ){ if( i < 1 || i > L.length+1 ) return ERROR; // 插入位置不合法 if( L.length >= L.listsize ) { // 如果当前的内存已经用完就要扩展内存 L.listsize += LISTINCREMENT; ElemType * newbase = ( ElemType * ) realloc( L.elem , L.listsize*sizeof(ElemType)); if( !newbase ) return ERROR;//扩展失败 L.elem = newbase; } for( int j = L.length ; j >= i ; j -- ) L.elem[j] = L.elem[j-1]; // 开始把i往后的每一位向后移动一位 L.elem[i-1] = e; L.length ++; return OK; }

2|06-2 带头单链表实现


int ListLength(LinkList L ){ // 通过循环的方式,数出有多少给元素 LinkList p = L->next; int cnt = 0; for( ; p != NULL ; p = p->next ) cnt ++; return cnt; } int LocateElem(LinkList L,ElemType e , Status(*compare)(ElemType,ElemType) ){ // 单链表遍历 LinkList p = L->next; for( int i = 1 ; p != NULL ; p = p->next , i ++ ) if( compare( p->data , e ) ) return i; return 0; } Status ListInsert(LinkList L , int i , ElemType e ){ LinkList p = L; for( ; i > 1 ; i -- ) p = p->next; LinkList q = (LinkList)malloc(sizeof (LNode) ); q->next = p->next , q->data = e; p->next = q; return OK; }

3|07-1 运用循环单链表实现约瑟夫问题


#include<iostream> using namespace std; struct Person{ int id; // 当前人的编号 Person *Next; // 指向下一个人 Person( int id , Person *Next ) : id(id) , Next(Next){}; }; class CycleList{ private: int cnt; Person * Head; // 开头,循环链表实际上是没有头尾的这里只是方便循环 public: CycleList( int n ){//构造函数 Person *Now; Head = Now = new Person( 1 , nullptr ); cnt = n; for( int i = 2 ; i <= n ; i ++ ) Now->Next = new Person( i , nullptr ) , Now = Now->Next; Now->Next = Head; } int getSize(){ return cnt; } Person * getHead(){ return Head; } Person * jumpStep( Person * it , int k ){//从it向后跳 k 步 while(k) k -- , it =it->Next; return it; } Person * eraseNext( Person * it ){// 删除 it 的下一个点 Person * cur = it->Next; if( cur == Head ) Head = cur->Next; // 如果下一个点是头结点要把头节点也修改 it->Next = it->Next->Next; delete cur; cnt --; return it->Next; } void Print(){// 从头节点开始依次输出 auto it = Head; do{ cout << it->id << " " , it = it->Next; }while( it != Head );// 再次回到头节点,输出完成 cout << "\n"; } }; int main(){ int a , b; cin >> a >> b; CycleList CL = CycleList(a); Person *it = CL.getHead(); while( CL.getSize() > 2 ){ it = CL.jumpStep( it , b-2 );//向后跳b-2步 it = CL.eraseNext(it); } Person * c = CL.getHead() , *d = CL.jumpStep( c , 1 ); cout << c->id << " " << d->id << endl; }

4|07-2 运用顺序表实现多项式相加


用一个数组存一下每个指数对应的系数。这里的题目有点问题,对于每组数据应该读入两个多项式的。

#include <iostream> #include <vector> using namespace std; void solve(){ int k[100]; fill( k , k+100 , 0 ); int n; cin >> n; for( int p , x ; n ; n -- ) cin >> p >> x , k[p] += x; cin >> n; for( int p , x ; n ; n -- ) cin >> p >> x , k[p] +=x; for( int i = 0 , f = 0 ; i < 100 ; i ++ ) if( k[i] > 0 ){ if( f ) cout << "+"; else f = 1; cout << k[i] << "x^" << i; } else if( k[i] < 0 ) cout << k[i] << "x^" << i; cout << endl; } int main(){ int T; cin >> T; for( ; T ; T -- ) solve(); }

5|07-3 两个序列的中位数


这里可以参考归并排序的方法,我们每次比较两个序列的头部,把较小的一个放到新的序列中,直到新序列的长度是n那么此时最后一个放入的数字就是中午位数

#include<bits/stdc++.h> using namespace std; int read(){ int x = 0 , ch = getchar(); while( ch < '0' || ch > '9' ) ch = getchar(); while( ch >= '0' && ch <= '9' ) x = ( x << 3 ) + ( x << 1 ) + ch - '0' , ch = getchar(); return x; } int main(){ int n = read(); vector<int> a(n+1) , b(n+1); for( int i = 1 ; i <= n ; i ++ ) a[i] = read(); for( int i = 1 ; i <= n ; i ++ ) b[i] = read(); int res = 0; for( int i = 1 , j = 1 ; i + j - 2 != n ; ){ if( a[i] > b[j] ) res = b[j] , j ++; else res = a[i] , i ++; } cout << res; return 0; }

__EOF__

本文作者PHarr
本文链接https://www.cnblogs.com/PHarr/p/16693327.html
关于博主:前OIer,SMUer
版权声明CC BY-NC 4.0
声援博主:如果这篇文章对您有帮助,不妨给我点个赞
posted @   PHarr  阅读(283)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示