(数据结构实验)

任务描述:请实现一个链表类L,L的节点Node 中的数据使用char类型。请创建L的两个实例a和 b,a、b各自从交互界面上接收用户输入的字符串并保存在链表中,请为L编写一个函数diff。它以a、b为输入,输出的结果是链表c,c包含了所有在a中有出现、且在b中没出现的字符(同一个字符,可能在a中出现多次,但在c中,只需出现一次)。如: a=…aabbccdd… b=ab则 c=ccdd:
题解如下:

#include<stdio.h>
#include<iostream>
#include<string>
#include <cstdlib>


typedef struct LNode *PtrToLNode;
struct LNode {
    char Data;
    PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;

#define ERROR NULL
List MakeEmpty(){
    List L;
    L=(PtrToLNode)malloc(sizeof(struct LNode));
    L->Next=NULL;
    return L;
}

bool Insert( List L, char X, Position P ){
    PtrToLNode p=L,w;
    while(p){
        if(p->Next==P){
            w=(PtrToLNode)malloc(sizeof(struct LNode));
            w->Data=X;
            w->Next=P;p->Next=w;
            return true;
        }
        p=p->Next;
    }
    printf("Wrong Position for Insertion\n");
    return false;
}
bool Delete( List L, Position P ){
    PtrToLNode p=L;
    while(p){
        if(p->Next==P&&P!=NULL){
            p->Next=P->Next;
            free(P);
            return true;
        }
        p=p->Next;
    }
    printf("Wrong Position for Deletion\n");
    return false;
}
Position Find( List L, char X ){
    PtrToLNode p=L->Next;
    while(p){
        if(p->Data==X){
            return p;
        }
        p=p->Next;
    }

    return ERROR;
}
int main()
{
    List L;
    char X;
    Position P;
    int N;
    bool flag;

    L = MakeEmpty();
    scanf("%d", &N);
    while ( N-- ) {
        getchar();
        scanf("%c", &X);
        flag = Insert(L, X, L->Next);
        if ( flag==false ) printf("Wrong Answer\n");
    }
    scanf("%d", &N);
    while ( N-- ) {
        getchar();
        scanf("%c", &X);
        P = Find(L, X);
        while (P){
            P= Find(L, X);
            Delete(L,P);
        }
    }
    printf("最后的结果为---->");
    for ( P=L->Next; P; P = P->Next ) printf("%c ", P->Data);
    return 0;
}

效果图如下:
在这里插入图片描述

由于up未细化 如有建议欢迎交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值