2.29√ 已知ABC为三个递增有序的线性表,现要求对A表进行如下操作:删去那些即在B表中出现,又在C表中出现的元素(题中没有特别指明同一表中的元素值各不相同)

#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
#define maxsize 10

typedef int ElemType;
typedef int status;

typedef struct
{
    ElemType *data;
    int length;
}SqList;

SqList creat()
{   
    SqList L;
    int len;
    
    scanf("%d", &len);
    L.data = (ElemType *)malloc(sizeof(int)*(len));
    int a;
    for (int i=0; i<len; i++)
    {   
        printf("请输入第%d个元素值:", i+1);
        scanf("%d", &a);
        L.data[i] = a;
    }
    L.length = len;
    
    return L;
}

void print(SqList A)
{
    for(int i=0; i<A.length; i++)
        printf("%d\n", A.data[i]);
}


SqList delete(SqList A, SqList B, SqList C)
{//删除A表中同时在B表和C表中出现的元素,ABC均为递增有序的顺序表
    
    int i=0, j=0, k=0;      //ijk分别用于扫描表ABC;
    if(A.length>0)
    {
        while(i<A.length && j<B.length && k<C.length)
        {
            if(B.data[j] == C.data[k])
            {
                if(A.data[i] == B.data[j])
                {
                    int no = i+1;   int count = 1;
                    
                    //往前找到与下标为i的元素值不同的元素
                    while(A.data[i] == A.data[no])   
                    {
                        no ++;
                        count ++;
                    }//退出循环时no表示元素值大于A.data[i]的第一个元素下标,
                    //count表示与A[i]元素值相等的元素个数
                    
                    for (int h=no; h<A.length; h++)    //删除符合条件的元素
                        A.data[h-count] = A.data[h];

                    A.length -= count;
                    j++;
                    k++;
                }
                else if(A.data[i] < B.data[j])
                    i++;
                else
                {
                    j++;
                    k++;
                }
            }
            else if(B.data[j] < C.data[k])
                j++;
            else
                k++;
        }
    }
    
    return A;
}


int main()
{
    printf("请输入待建表A的表长:\n");
    SqList A = creat();
    printf("请输入待建表B的表长:\n");
    SqList B = creat();
    printf("请输入待建表C的表长:\n");
    SqList C = creat();
    
    A = delete(A, B, C);
    print(A);
    
    return 0;
}

  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是C语言实根据已知数据六个字母及在通信中出现频率,把这些字母和频率作为叶子结点及权计算带权路径长度WPL的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义Huffman树结点的结构体 struct node { char ch; // 字母 float weight; // 权出现频率) struct node *left; // 左子树指针 struct node *right; // 右子树指针 }; // 计算Huffman树的带权路径长度WPL float calc_wpl(struct node *root, int depth) { if (root == NULL) { return 0; } else if (root->left == NULL && root->right == NULL) { // 叶子结点 return root->weight * depth; } else { // 非叶子结点,递归计算左右子树的WPL return calc_wpl(root->left, depth + 1) + calc_wpl(root->right, depth + 1); } } int main() { // 定义Huffman树结点数组 struct node nodes[] = { {'A', 0.25, NULL, NULL}, {'B', 0.12, NULL, NULL}, {'C', 0.18, NULL, NULL}, {'D', 0.05, NULL, NULL}, {'E', 0.30, NULL, NULL}, {'F', 0.10, NULL, NULL} }; int n = sizeof(nodes) / sizeof(struct node); // 构建Huffman树 for (int i = 0; i < n - 1; i++) { // 选出权最小的两个结点 int min1 = 0, min2 = 1; if (nodes[min1].weight > nodes[min2].weight) { int temp = min1; min1 = min2; min2 = temp; } for (int j = 2; j < n - i; j++) { if (nodes[j].weight < nodes[min1].weight) { min2 = min1; min1 = j; } else if (nodes[j].weight < nodes[min2].weight) { min2 = j; } } // 合并两个结点 nodes[n + i].weight = nodes[min1].weight + nodes[min2].weight; nodes[n + i].left = &nodes[min1]; nodes[n + i].right = &nodes[min2]; // 将新结点插入数组,并删除旧结点 nodes[min1] = nodes[n + i]; nodes[min2] = nodes[n + i + 1]; } // 计算Huffman树的带权路径长度WPL float wpl = calc_wpl(&nodes[n * 2 - 2], 0); // 输出结果 printf("带权路径长度WPL为:%.2f\n", wpl); return 0; } ``` 在这个示例代码中,我们定义了一个包含6个字母及其出现频率的Huffman树结点数组,然后使用类似选择排序的算法构建Huffman树。最后,我们调用`calc_wpl`函数计算Huffman树的带权路径长度WPL,并输出结果。 运行这个示例代码,可以得到以下的输出结果: ``` 带权路径长度WPL为:2.29 ``` 这个结果示,这个Huffman树的带权路径长度WPL为2.29
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值