数据结构实验教程-第三套

问题1:

已知递增有序的单链表A、B、C分别存储了一个集合。设计算法完成运算:A=A-B∩C
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#define ElemType int

typedef struct Lnode {
    
    
    ElemType data;
    struct Lnode* next;
} Lnode, *LinkList;

void ListShow(LinkList L){
    
    
    for (Lnode *p = L->next;p;p = p->next){
    
    
        printf("%d\t",p->data);
    }
    printf("\n");
}

LinkList List_TailInsert(LinkList &L,int a[],int n){
    
    
    ElemType x;
    Lnode *s,*r;
    // r是尾指针,始终指向链表的尾部
    L = (LinkList)malloc(sizeof(Lnode));
    r = L;
   for(int i=0;i<n;i++){
    
    
        x = a[i];
        s = (Lnode*)malloc(sizeof(Lnode));
        s->next = r->next;
        r->next = s;
        s->data = x;
        r = s;
    }
    return L;
}

LinkList Union(LinkList &l1,LinkList &l2){
    
    
    Lnode *l3 = (Lnode*)malloc(sizeof(Lnode)),*p = l1->next,*q = l2->next,*rear = l3;
    l3->next = NULL;
    while (p&&q) {
    
    
        if(p->data == q->data){
    
    
            Lnode *tmp = (Lnode*)malloc(sizeof(Lnode));
            tmp->data = p->data;
            tmp->next = rear->next;
            rear->next = tmp;
            rear = tmp;
            p = p->next;
            q = q->next;
        }else if(p->data > q->data) q = q->next;
        else p = p->next;
    }
    return l3;
}

void Deduct(LinkList &l1,LinkList &l2){
    
    
    // 实现L1 - L2,结果直接储存到L1中
    Lnode *pre = l1,*p = l1->next,*q = l2->next;
    while (p&&q) {
    
    
        if(p->data == q->data){
    
    
            p = p->next;
            pre->next = p;
            // 删除节点
        }else if(p->data<q->data){
    
    
            pre = p;
            p = p->next;
        }else {
    
    
            q = q->next;
        }
    }
}
int main() {
    
    
    LinkList A,B,C,D;
    int a[] = {
    
    1,2,3,4,5,6,7,8,9},b[] = {
    
    1,3,5,7,9},c[] = {
    
    1,2,3,4,5};
    A = List_TailInsert(A,a,9);
    B = List_TailInsert(B,b,5);
    C = List_TailInsert(C,c,5);
    D = Union(C,B);
    ListShow(D);
    Deduct(A,D);
    ListShow(A);
    return 0;
}
// 已知递增有序的单链表A、B、C分别存储了一个集合。设计算法完成运算:A=A-B∩C

问题2:
在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include <stdlib.h>


struct TreeNode {
    
    
     char val;
     struct TreeNode *left;
     struct TreeNode *right;
 };


struct TreeNode* Build(char *preorder,int p1,int p2,char *order,int o1,int o2){
    
    
    struct TreeNode *root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    root->val = preorder[p1];
    int mid;
    for(mid = o1;order[mid]!=root->val;mid++) ;
    int llen = mid - o1;
    int rlen = o2 - mid;
    if(llen){
    
    
        root->left = Build(preorder,p1+1,p1+llen,order,o1,o1+llen-1);
    }
    else
        root->left = NULL;
    if(rlen){
    
    
        root->right = Build(preorder,p2-rlen+1,p2,order,o2-rlen+1,o2);
    }
    else
        root->right = NULL;
    return root;
}
struct TreeNode* buildTree(char* preorder, int preorderSize, char* inorder, int inorderSize){
    
    
    struct TreeNode *root;
    root = Build(preorder,0,preorderSize-1,inorder,0,inorderSize-1);
    return root;
}

void PrintLevel(struct TreeNode *root,int level){
    
    
    if(!root) return;
    printf("(%c,%d)\t",root->val,level);
    PrintLevel(root->left,level+1);
    PrintLevel(root->right,level+1);
}
int main()
{
    
    
    char *pre = "ABCDEFGHIJK";
    char *in = "CBEDFAHGJIK";
    struct TreeNode* t = buildTree(pre,11,in,11);
    PrintLevel(t,1);

    return 0;
}

问题3:
在这里插入图片描述

#define Maxsize 100
int martx[n][n] = {
    
    0};
//邻接矩阵
int visited[n];
void BFS(Graph G,int v){
    
    
    //广度优先遍历,从v开始
    int queue[Maxsize],tmp;
    int front = -1,rear = -1;
    visited[v] = 1;
    //将当前节点标记为已访问
    queue[++rear] = v;
    //入队
    while(rear>front){
    
    
        //队列非空
        tmp = queue[++front];
        //出队
        arcnode *p = G->vartex[tmp].firstarc;
        while(p){
    
    
            int j = p->adjvex;
            if(visited[j] == 0){
    
    
                queue[++rear] = j;
                visited[j] = 1;
                martx[v][j] = 1;
                martx[j][v] = 1;
                //由于是无向图,所以邻接矩阵对称
            }
            p = p->nextarc;
        }
    }
}

void BFSTraverse(Graph G){
    
    
    for(int i=0;i<G->vexnum;i++)
        visited[i] = 0;
    for(int i=0;i<G->vexnum;i++)
        if(visited[i] == 0)
            BFS(G,i);
}

猜你喜欢

转载自blog.csdn.net/Kilig___/article/details/127971730