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

6-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;
}

6-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;
}

7-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;
}

7-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();
}

7-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;
}
posted @ 2022-09-19 01:09  PHarr  阅读(270)  评论(0编辑  收藏  举报