数据结构实验(三)线性表的操作与应用
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;
}