郑州轻工业大学2020年数据结构练习集

6-1 顺序表操作集

/* 你的代码将被嵌在这里 */
List MakeEmpty()
{
    List p;
    p = (List)malloc(sizeof(struct LNode));
    p->Last = -1;
    return p;
}

Position Find( List L, ElementType X )
{
    int i = 0;
    while(i <= L->Last && X != L->Data[i])
        i++;
    if(i > L->Last)
        return ERROR;
    return i;
}

bool Insert( List L, ElementType X, Position P )
{
    P++;
    int j;
    if(L->Last == MAXSIZE-1)
    {
        printf("FULL");
        return false;
    }
    if(P<1 || P>L->Last+2)
    {
        printf("ILLEGAL POSITION");
        return false;
    }
    for(j=L->Last; j>=P-1; j--)
        L->Data[j+1] = L->Data[j];
    L->Data[P-1] = X;
    L->Last++;
    return true;
}

bool Delete( List L, Position P )
{
    P++;
    int j;
    if(P<1 || P>L->Last+1)
    {
        printf("POSITION %d EMPTY", P-1);
        return false;
    }
    for(j=P; j<=L->Last; j++)
        L->Data[j-1] = L->Data[j];
    L->Last--;
    return true;
}

6-2 带头结点的链式表操作集

/* 你的代码将被嵌在这里 */
List MakeEmpty()
{
    List p;
    p = (List)malloc(sizeof(struct LNode));
    p->Next = NULL;
    return p;
}

Position Find( List L, ElementType X )
{
    List p = L;
    int j=1;
    while(p!=NULL && p->Data!=X)
        p=p->Next, j++;
    if(p==NULL)
        return ERROR;
    return p;
}

List Findp( List L, Position P )
{
    List p = L;
    while(p!=NULL && P!=p->Next)
        p = p->Next;
    if(p==NULL)
        return NULL;
    return p;
}

bool Insert( List L, ElementType X, Position P )
{
    List s;
    List flag = Findp(L, P);
    if(flag == ERROR)
    {
        printf("Wrong Position for Insertion\n");
        return false;
    }
    else
    {
        s = (List)malloc(sizeof(struct LNode));
        s->Data = X;
        s->Next = P;
        flag->Next = s;
        return true;
    }
}

bool Delete( List L, Position P )
{
    List flag = Findp(L, P);

    if(flag == NULL)
    {
        printf("Wrong Position for Deletion\n");
        return false;
    }
    else
    {
        flag->Next = P->Next;
        free(P);
        return true;
    }
}

6-3 合并两个有序数组

/* 请在这里填写答案 */
void merge(int* a, int m, int* b, int n, int* c)
{
    int i=0, j=0, k=0;
    while(i<m&&j<n)
    {
        if(a[i]<b[j])
            c[k++] = a[i++];
        else
            c[k++] = b[j++];
    }
    while(i<m)
        c[k++] = a[i++];
    while(j<n)
        c[k++] = b[j++];
}

6-4 线性表元素的区间删除

/* 你的代码将被嵌在这里 */
List Delete( List L, ElementType minD, ElementType maxD )
{
    int sum = 0;
    for(int i = 0; i <= L->Last; i++)
    {
        if(L->Data[i]>minD && L->Data[i]<maxD)
            sum++;
        else
            L->Data[i-sum] = L->Data[i];
    }
    L->Last -= sum;
    return L;
}

6-5 递增的整数序列链表的插入

/* 你的代码将被嵌在这里 */
List Insert( List L, ElementType X )
{
    List in = (List)malloc(sizeof(struct Node));
    in->Data = X, in->Next = NULL;
    if(L->Next == NULL)
    {
        L->Next = in;
        return L;
    }
    List temp = L;
    while(temp->Next->Data < X)
    {
        temp = temp->Next;
        if(temp->Next == NULL)
        {
            temp->Next = in;
            return L;
        }
    }
    in->Next = temp->Next;
    temp->Next = in;
    return L;
}

6-6 两个有序链表序列的合并

/* 你的代码将被嵌在这里 */
List Merge( List L1, List L2 )
{
    List L;
    L = (List)malloc(sizeof(struct Node));
    List t = L, t1 = L1->Next, t2 = L2->Next;
    while(t1!=NULL && t2!=NULL)
    {
        if(t1->Data <= t2->Data)
        {
            t->Next = t1;
            t = t->Next;
            t1 = t1->Next;
        }
        else
        {
            t->Next = t2;
            t = t->Next;
            t2 = t2->Next;
        }
    }
    t->Next = t1 == NULL ? t2 : t1;
    L1->Next = NULL;
    L2->Next = NULL;
    return L;
}

6-7 求链表的倒数第m个元素

/* 你的代码将被嵌在这里 */
ElementType Find( List L, int m )
{
    List t = L->Next;
    int num = 0;
    while(t!=NULL)
        num++, t = t->Next;
    if(m<=0||m>num)
        return ERROR;
    num -= m;
    t = L->Next;
    while(num--)
        t = t->Next;
    return t->Data;
}

6-8 双端队列

/* 你的代码将被嵌在这里 */
bool Push( ElementType X, Deque D )
{
    if( (D->Rear+1) % D->MaxSize == D->Front)
        return false;
    D->Front = (D->Front - 1 + D->MaxSize) % D->MaxSize;
    D->Data[D->Front] = X;
    return true;
}
ElementType Pop( Deque D )
{
    if(D->Front == D->Rear)
        return ERROR;//不要写成-1
    int t = D->Data[D->Front];
    D->Front = (D->Front + 1) % D->MaxSize;
    return t;
}
bool Inject( ElementType X, Deque D )
{
    if( (D->Rear + 1) % D->MaxSize == D->Front)
        return false;
    D->Data[D->Rear] = X;
    D->Rear = (D->Rear + 1) % D->MaxSize;
    return true;
}
ElementType Eject( Deque D )
{
    if(D->Front == D->Rear)
        return ERROR;//不要写成-1
    D->Rear = (D->Rear - 1 + D->MaxSize) % D->MaxSize;
    return D->Data[D->Rear];
}

6-9 求二叉树高度

/* 你的代码将被嵌在这里 */
int GetHeight( BinTree BT )
{
    if(BT == NULL)
        return 0;
    int num = 0;
    if(BT->Left)
        num = num >= GetHeight(BT->Left) ? num : GetHeight(BT->Left);
    if(BT->Right)
        num = num >= GetHeight(BT->Right) ? num : GetHeight(BT->Right);
    return num + 1;
    
}

6-10 二叉树的遍历

/* 你的代码将被嵌在这里 */
void InorderTraversal( BinTree BT )//中
{
    if(BT == NULL)  
        return;
    InorderTraversal(BT->Left);
    printf(" %c", BT->Data);
    InorderTraversal(BT->Right);
}
void PreorderTraversal( BinTree BT ) //前
{
    if(BT == NULL)  
        return;
    printf(" %c", BT->Data);
    PreorderTraversal(BT->Left);
    PreorderTraversal(BT->Right);
}
void PostorderTraversal( BinTree BT ) //后
{
    if(BT == NULL)  
        return;
    PostorderTraversal(BT->Left);
    PostorderTraversal(BT->Right);
    printf(" %c", BT->Data);
}
void LevelorderTraversal( BinTree BT )//层次
{
    if(BT == NULL)
        return;
    BinTree queu[100];
    int fro = 0, rear = 0, maxsize = 100;
    queu[rear++] = BT;
    while(fro != rear)
    {
        BinTree t = queu[fro++];
        fro %= maxsize;
        if(t->Left)
            queu[rear++] = t->Left;
        rear %= maxsize;
        if(t->Right)
            queu[rear++] = t->Right;
        rear %= maxsize;
        printf(" %c", t->Data);
    }
}

6-11 二叉树的非递归遍历

害 和上面一样

6-12 邻接矩阵存储图的深度优先遍历

/* 你的代码将被嵌在这里 */
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) )
{
    Visited[V] = true;
    Visit(V);
    for(int i=0; i<Graph->Nv; i++)
    {
        int x = Graph->G[V][i];
        if(Visited[i] || x == INFINITY)
            continue;
        DFS(Graph, i, Visit);
    }
}

6-13 邻接表存储图的广度优先遍历

void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) )
{
    Vertex queu[100];
    int fro = 0, rear = 0, maxsize = 100;
    queu[rear] = S;
    rear = (rear + 1) % maxsize;
    Visited[S] = true;
    while(fro != rear)
    {
        Vertex h = queu[fro];
        fro = (fro + 1) % maxsize;
        Visit(h);
        PtrToAdjVNode t = Graph->G[h].FirstEdge;
        while(t != NULL)
        {
            int i = t->AdjV;
            if(Visited[i] != true)
            {
                Visited[i] = true;
                queu[rear] = i;
                rear = (rear + 1) % maxsize;
            }
            t = t->Next;
        }
    }
}

7-1 一元多项式的乘法与加法运算
链表为空时记得输出“0 0”

#include <stdio.h>
#include <stdlib.h>
using namespace std;

typedef struct Node *List;
struct Node
{
    int xi, mi;
    List next;
};

List MakeEmpty();
void Insert(List L, Node *x);
void Delete(List L, Node *x);
void in_it();
void solve();
void show(List L);

List a, b, c, d;
char flag;

int main()
{
    in_it();
    solve();
    show(c);
    show(d);
}

void in_it()
{
    int xi, mi;
    a = MakeEmpty();
    int n;
    scanf("%d", &n);
    while(n--)
    {
        scanf("%d%d", &xi, &mi);
        Node *x;
        x = (Node*)malloc(sizeof(struct Node));
        x->xi = xi, x->mi = mi;
        x->next = NULL;
        Insert(a, x);
    }
    b = MakeEmpty();
    scanf("%d", &n);
    while(n--)
    {
        scanf("%d%d", &xi, &mi);
        Node *x;
        x = (Node*)malloc(sizeof(struct Node));
        x->xi = xi, x->mi = mi;
        x->next = NULL;
        Insert(b, x);
    }
}

void solve()
{
    List ta, tb;
    c = MakeEmpty();
    ta = a;
    while(ta->next != NULL)
    {
        ta = ta->next;
        tb = b;
        while(tb->next != NULL)
        {
            tb = tb->next;
            Node *t;
            t = (Node*)malloc(sizeof(struct Node));
            t->mi = ta->mi + tb->mi;
            t->xi = ta->xi * tb->xi;
            t->next = NULL;
            Insert(c, t);
        }
    }
    d = MakeEmpty();
    ta = a;
    while(ta->next != NULL)
    {
        ta = ta->next;
        Node *t;
        t = (Node*)malloc(sizeof(struct Node));
        t->mi = ta->mi;
        t->xi = ta->xi;
        t->next = NULL;
        Insert(d, t);
    }
    tb = b;
    while(tb->next != NULL)
    {
        tb = tb->next;
        Node *t;
        t = (Node*)malloc(sizeof(struct Node));
        t->mi = tb->mi;
        t->xi = tb->xi;
        t->next = NULL;
        Insert(d, t);
    }
}

void show(List L)
{
    List t = L;
    while(t->next != NULL)
    {
        t = t->next;
        if(t->next == NULL)
            printf("%d %d", t->xi, t->mi);
        else
            printf("%d %d ", t->xi, t->mi);
    }
    if(L->next == NULL)
        puts("0 0");
    else
        puts("");
}

List MakeEmpty()
{
    List L;
    L = (List)malloc(sizeof(struct Node));
    L->next = NULL;
    return L;
}

void Insert(List L, Node *x)
{
    if(L->next == NULL)
    {
        L->next = x;
        return;
    }
    List temp = L;
    while(x->mi <= temp->next->mi)
    {
        temp = temp->next;
        if(temp->next == NULL)
            break;
    }
    if(temp->mi == x->mi)
    {
        if(temp->xi == -x->xi)
            Delete(L, temp);
        else
            temp->xi += x->xi;
    }
    else
    {
        x->next = temp->next;
        temp->next = x;
    }
    return;
}

void Delete(List L, Node *x)
{
    List t = L;
    while(t->next != x)
        t = t->next;
    t->next = t->next->next;
}

7-2 Reversing Linked List

#include<bits/stdc++.h>
using namespace std;

int Node[100010][2];

int main()
{
    int fro, n, k;
    scanf("%d%d%d", &fro, &n, &k);
    for(int i=0; i<n; i++)
    {
        int add, data, next;
        scanf("%d%d%d", &add, &data, &next);
        Node[add][0] = data;
        Node[add][1] = next;
    }
    vector<int> HeadAdd;
    while(fro != -1)
    {
        HeadAdd.push_back(fro);
        fro = Node[fro][1];
    }
    n = HeadAdd.size();
    for(int i=0; i+k-1<n; i+=k)
        reverse(HeadAdd.begin()+i, HeadAdd.begin()+i+k);
    for(int i=0; i<n; i++)
    {
        printf("%05d %d ", HeadAdd[i], Node[HeadAdd[i]][0]);
        (i == n-1) ? printf("-1\n") : printf("%05d\n", HeadAdd[i+1]);

    }
    return 0;
}

7-3 符号配对

#include<bits/stdc++.h>
using namespace std;

string s;
stack<char> sta;
void solve();
int judge();

int main()
{
    s = "";
    string t;
    while(1)
    {
        cin >> t;
        if(t[0] == '.')
            break;
        s += t;
    }
    solve();
    return 0;
}

void solve()
{
    int n = s.size();
    for(int i=0; i<n; i++)
    {
        char ch = s[i];
        switch(ch)
        {
        case '(':
            sta.push('(');
            break;
        case '{':
            sta.push('{');
            break;
        case '/':
            if(i+1<n && s[i+1]=='*')
                i++, sta.push('/');
            break;
        case '[':
            sta.push('[');
            break;
        case '*':
            if(i+1<n && s[i+1]=='/')//判断这个 * 不是乘号
            {
                if(!sta.empty() && sta.top()=='/')
                    i++, sta.pop();
                else
                {
                    if(!judge())
                        printf("NO\n?-*/");
                    return;
                }
            }

            break;
        case ')':
            if(!sta.empty() && sta.top()=='(')
                sta.pop();
            else
            {
                if(!judge())
                    printf("NO\n?-)");
                return;
            }
            break;
        case '}':
            if(!sta.empty() && sta.top()=='{')
                sta.pop();
            else
            {
                if(!judge())
                    printf("NO\n?-}");
                return;
            }
            break;
        case ']':
            if(!sta.empty() && sta.top()=='[')
                sta.pop();
            else
            {
                if(!judge())
                    printf("NO\n?-]");
                return;
            }
            break;
        }
    }
    if(sta.empty())
        printf("YES\n");
    else if(sta.top()=='/')
        cout<<"NO\n/*-?";
    else if(sta.top()=='(')
        cout<<"NO\n(-?";
    else if(sta.top()=='[')
        cout<<"NO\n[-?";
    else if(sta.top()=='{')
        cout<<"NO\n{-?";
}

int judge()
{
    if(sta.empty())
        return 0;
    else if(sta.top() == '(')
        printf("NO\n(-?");
    else if(sta.top() == '[')
        printf("NO\n[-?");
    else if(sta.top() == '{')
        printf("NO\n{-?");
    else if(sta.top() == '/')
        printf("NO\n/*-?");
    return 1;
}

7-4 表达式转换

#include<bits/stdc++.h>
using namespace std;

int level(char x)
{
    if(x == '(' || x == ')')
        return 3;
    else if(x == '*' || x == '/')
        return 2;
    else if(x == '+' || x == '-')
        return 1;
}

int main()
{
    string s;
    cin >> s;
    stack<char> fu;
    int flag = 0;
    for(unsigned int i=0; i<s.size(); i++)
    {
        if(((i==0||s[i-1]=='(') && string("+-").find(s[i])!=string::npos) || s[i]=='.' || isdigit(s[i]))
        {
            if(flag)
                putchar(' ');
            flag++;
            if(s[i]!='+')
                putchar(s[i]);
            while(s[i+1]=='.' || isdigit(s[i+1]))
            {
                i++;
                putchar(s[i]);
            }
        }
        else
        {
            if(s[i]==')')
            {
                while(fu.size() && fu.top()!='(')
                {
                    putchar(' ');
                    putchar(fu.top());
                    fu.pop();
                }
                fu.pop();
            }
            else if(fu.size()==0 || level(s[i])>level(fu.top()))
            {
                fu.push(s[i]);
            }
            else
            {
                while(fu.size() && fu.top()!='(')
                {
                    putchar(' ');
                    putchar(fu.top());
                    fu.pop();
                }
                fu.push(s[i]);
            }
        }
    }
    while(fu.size())
    {
        putchar(' ');
        putchar(fu.top());
        fu.pop();
    }
}

7-5 银行业务队列简单模拟

#include<bits/stdc++.h>
using namespace std;

int main()
{
    queue<int> a, b;
    int n;
    cin >> n;
    for(int i=0; i<n; i++)
    {
        int t;
        cin >> t;
        if(t%2 == 1)
            a.push(t);
        else
            b.push(t);
    }
    int flag = 0;
    while(!a.empty() || !b.empty())
    {
        for(int i=0; i<2; i++)
        {
            if(!a.empty())
            {
                if(flag)
                    cout << ' ';
                flag++;
                cout << a.front();
                a.pop();
            }
        }
        if(!b.empty())
        {
            if(flag)
                cout << ' ';
            flag++;
            cout << b.front();
            b.pop();
        }
    }
}


7-6 堆栈模拟队列
一个作为输入栈a,一个作为输出栈b。a的栈底元素是队列的队首元素,将a中元素放入b中,那么b的栈顶元素就是队列的队首元素,即可输出。
输入:
a只要没满 输入到a中
a满 b空 a中元素放入b
a满 b不空 ERROR:Full
输出:
b只要不空 输出b.top()
b空 a不空 a中元素放入b,输出b.top()
b空 a空 ERROR:Empty

#include<bits/stdc++.h>
using namespace std;

int main()
{
    stack<int> a, b;
    int n, m;
    cin >> n >> m;
    n = min(n, m);
    while(1)
    {
        char ch;
        cin >> ch;
        if(ch == 'T')
            break;
        else if(ch == 'A')
        {
            int tmp;
            cin >> tmp;
            if(a.size() < n)//a没满
                a.push(tmp);
            else//a满了
            {
                if(b.empty())//b为空
                {
                    while(!a.empty())//a中元素放入b中
                    {
                        int t = a.top();
                        a.pop();
                        b.push(t);
                    }
                    a.push(tmp);
                }
                else//b不为空
                {
                    printf("ERROR:Full\n");
                }
            }
        }
        else
        {
            if(!b.empty())//b不为空
            {
                int t = b.top();
                b.pop();
                cout << t << endl;//输出栈顶元素,也就是队首元素
            }
            else//b为空
            {
                if(!a.empty())//a不为空
                {
                    while(!a.empty())//a中元素放入b中
                    {
                        int t = a.top();
                        a.pop();
                        b.push(t);
                    }
                    int t = b.top();
                    b.pop();
                    cout << t << endl;
                }
                else//a为空
                {
                    printf("ERROR:Empty\n");
                }
            }
        }
    }
}


7-7 串的模式匹配

#include<bits/stdc++.h>
using namespace std;
const int N=1e6;

char s[N+5], p[N+5];
int nxt[N+5];
int plen, slen;

void getNext()
{
    int i=0,j=-1;
    nxt[0]=-1;
    while(i<plen)
    {
        if(j==-1||p[i]==p[j])
            nxt[++i]=++j;
        else
            j=nxt[j];
    }
}

int KMP()
{
    plen=strlen(p);
    slen=strlen(s);
    getNext();
    int i=0,j=0;
    while(i<slen)
    {
        if(j==-1||s[i]==p[j])
            i++, j++;
        else
            j=nxt[j];
        if(j == plen)
            return i-j;
    }
    return -1;
}

int main()
{
    scanf("%s", s);
    int n;
    scanf("%d", &n);
    while(n--)
    {
        memset(nxt, 0, sizeof(nxt));
        scanf("%s", p);
        int ans=KMP();
        if(ans == -1)
            printf("Not Found\n");
        else
            printf("%s\n", s+ans);
    }
}

7-8 树的同构
暴力比对
n不等于m No
两个树的相同节点的左右孩子要一样,否则 No

#include<bits/stdc++.h>
using namespace std;

struct node
{
    char n, l, r;
};

int judge();

int n, m;
node a[100], b[100];

int main()
{
    scanf("%d", &n);
    for(int i=0; i<n; i++)
        scanf(" %c %c %c", &a[i].n, &a[i].l, &a[i].r);
    scanf("%d", &m);
    for(int i=0; i<m; i++)
        scanf(" %c %c %c", &b[i].n, &b[i].l, &b[i].r);
    int ans = judge();
    if(ans)
        printf("Yes\n");
    else
        printf("No\n");
}

int judge()
{
    if(n != m)
        return 0;
    for(int i=0; i<n; i++)
    {
        int j;
        for(j=0; j<m; j++)
        {
            if(a[i].n == b[j].n)
            {
                char al, ar, bl, br;
                if(a[i].l == '-')
                    al = -1;
                else
                    al = a[int(a[i].l-'0')].n;
                if(a[i].r == '-')
                    ar = -1;
                else
                    ar = a[int(a[i].r-'0')].n;
                if(b[j].l == '-')
                    bl = -1;
                else
                    bl = b[int(b[j].l-'0')].n;
                if(b[j].r == '-')
                    br = -1;
                else
                    br = b[int(b[j].r-'0')].n;
                if( !((al == bl && ar == br) || (al == br && ar == bl)) )
                    return 0;
                break;
            }
        }
        if(j == m)
            return 0;
    }
    return 1;
}


7-9 列出叶结点
由于给的数据不是按“从上到下,从左到右”的顺序给的,所以在创建树的过程中可能会产生多个树,因此用并查集存每个节点的父节点,方便查找根节点。
用队列进行层次遍历

#include<bits/stdc++.h>
using namespace std;

int node[15][2];
int f[15];
int n;


int findx(int x)
{
    return f[x] = (x == f[x] ? x : findx(f[x]));
}

void dfs(int x)
{
    queue<int> t;
    t.push(x);
    int flag = 0;
    while(!t.empty())
    {
        int ro = t.front(), l = node[ro][0], r = node[ro][1];
        t.pop();
        if(l == -1 && r == -1)
        {
            if(flag++)
                printf(" ");
            printf("%d", ro);
        }
        if(l != -1)
            t.push(l);
        if(r != -1)
            t.push(r);
    }
}

int main()
{
    for(int i=0; i<15; i++)
        f[i] = i;
    scanf("%d", &n);
    for(int i=0; i<n; i++)
    {
        char l, r;
        scanf(" %c %c", &l, &r);
        int il, ir;
        if(l == '-')
            il = -1;
        else
            il = l - '0';
        if(r == '-')
            ir = -1;
        else
            ir = r - '0';
        node[i][0] = il, node[i][1] = ir;
        if(il != -1)
            f[il] = findx(i);
        if(ir != -1)
            f[ir] = findx(i);
    }
    int root = findx(0);
    dfs(root);
    return 0;
}


7-10 修理牧场
哈夫曼树??贪心

#include<bits/stdc++.h>
using namespace std;


int main()
{
    priority_queue<int, vector<int>, greater<int> > q;//greate升序,less降序
    int n, t;
    scanf("%d", &n);
    for(int i=0; i<n; i++)
    {
        scanf("%d", &t);
        q.push(t);
    }
    long long sum = 0;
    while(q.size() != 1)
    {
        int a,b;
        a = q.top(), q.pop();
        b = q.top(), q.pop();
        sum += a+b;
        q.push(a+b);
    }
    printf("%lld\n", sum);
}


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值