线性表(顺序表和链式表)

#include<iostream>
#include<cstdio>
#define LIST_INIT_SIZE 100      //初始数量
#define LISTINCREMENT 10        //增加量
#define LA_INITLEN 3            //La初始长度
#define LB_INITLEN 4            //Lb初始长度
typedef int ElemType;
typedef int Status;

typedef struct {
    ElemType *elem;
    int length;
    int listsize;
}SqList;

Status InitList_Sq(SqList &L) {        //初始化顺序表
    L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if (!L.elem)exit(OVERFLOW);
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;
    return 1;
}

Status GetElem(SqList L, int i,ElemType &e) {    //获取位于i的元素
    if (i<1 || i>L.length )exit(0);
    e = L.elem[i-1];
    return 1;
}

Status ListInsert_Sq(SqList&L, int i, ElemType e) {      //在i位置前插入e
    if (i<1 || i>L.length + 1)return 0;
    if (L.length >= L.listsize) {
        ElemType* newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
        if (!newbase)exit(OVERFLOW);
        L.elem = newbase;
        L.listsize += LISTINCREMENT;
    }
    int*q = &(L.elem[i - 1]);
    for (int*p = &(L.elem[L.length - 1]); p >= q; --p)
        *(p + 1) = *p;
    *q = e;
    ++L.length;
    return 1;
}

Status LocateElem(SqList L, int e) {        //判断元素e是否位于L中
    int em,i;
    for ( i = 1; i <= L.length; i++) {
        GetElem(L, i, em);
        if (e == em)break;
    }
    if (i > L.length)return 0;
    return 1;
}
void Union(SqList La, SqList Lb, SqList &Lc) {         //顺序表并操作
    ElemType e;
    int La_len = La.length;
    int Lb_len = Lb.length;
    int Lc_len = Lc.length;
    for (int i = 1; i <= La_len; i++) {
        GetElem(La, i, e);
        ListInsert_Sq(Lc, ++Lc_len, e);
    }
    for (int i = 1; i <= Lb_len; i++) {
        GetElem(Lb, i, e);
        if (!LocateElem(Lc, e))ListInsert_Sq(Lc,++Lc_len , e);
    }
}

void Intersection(SqList La, SqList Lb, SqList &Lc) {       //顺序表交操作
    ElemType e;
    int La_len = La.length;
    int Lb_len = Lb.length;
    int Lc_len = Lc.length;
    for (int i = 1; i <= La_len; i++) {
        GetElem(La, i, e);
        if (LocateElem(Lb, e))ListInsert_Sq(Lc, ++Lc_len, e);
    }
}

void Diff(SqList La, SqList Lb, SqList &Lc) {         //顺序表差操作
    int e = 0;
    SqList Lc2;
    InitList_Sq(Lc2);
    Intersection( La, Lb,Lc2);
    int Lc_len = Lc.length;
    for (int i = 1; i <= La.length; i++) {
        GetElem(La,i,e);
        if (!LocateElem(Lc2, e))ListInsert_Sq(Lc, ++Lc_len, e);
    }
}

void Show(SqList L) {           //打印顺序表所有元素
    for (int i = 0; i < L.length; i++) {
        printf("%d ", L.elem[i]);
    }
    printf("\n");
}
//==================分界线
typedef struct LNode {
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;

Status GetElem_L(LinkList L, int i, ElemType &e) {        //获取链表中位于i的元素
    LinkList p = L->next;
    int j = 1;
    while (p&&j < i) {
        p = p->next;
        ++j;
    }
    if (!p || j > i)return 0;
    e = p->data;
    return 1;
}

Status List_Insert_L(LinkList&L, int i, ElemType e) {         //在位置i前插入元素e
    LinkList p = L;
    int j = 0;
    while (p&&j < i - 1) {
        p = p->next;
        ++j;
    }
    if (!p || j < i - 1)return 0;
    LinkList s = (LinkList)malloc(sizeof(LNode));
    s->data = e;
    s ->next = p->next;
    p->next = s;
    return 1;
}

void CreateList_L(LinkList &L, int n) {            //创建链表
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    for (int i = n; i > 0; --i) {
        LinkList p = (LinkList)malloc(sizeof(LNode));
        scanf("%d",&p->data);
        p->next = L->next;
        L->next = p;
    }
}
Status LocateElem_L(LinkList &L,ElemType e) {         //判断e是否在链表L中
    LinkList p = L->next;
    while (p) {
        if (e == p->data)break;
        p = p->next;
    }
    if (p)return 1;
    return 0;
}

int Getlen_L(LinkList &L) {          //获取链表L的长度
    LinkList p = L->next;
    int len = 0;
    while (p) {
        len++;
        p = p->next;
    }
    return len;
}

void Union_L(LinkList &La, LinkList&Lb, LinkList&Lc) {   //链表并操作
    int e;
    int La_len = Getlen_L(La);
    int Lb_len = Getlen_L(Lb);
    int Lc_len = 0;
    for (int i = 1; i <= La_len; i++) {
        GetElem_L(La, i, e);
        List_Insert_L(Lc, Lc_len++, e);
    }
    for (int i = 1; i <= Lb_len; i++) {
        GetElem_L(Lb, i, e);
        if (!LocateElem_L(Lc, e))List_Insert_L(Lc, Lc_len++, e);
    }
}

void Intersection_L(LinkList &La, LinkList&Lb, LinkList&Lc) {         //链表交操作
    ElemType e;
    int La_len = Getlen_L(La);
    int Lb_len = Getlen_L(Lb);
    int Lc_len = 0;
    for (int i = 1; i <= La_len; i++) {
        GetElem_L(La, i, e);
        if (LocateElem_L(Lb, e))List_Insert_L(Lc, Lc_len++, e);
    }
}

void Diff(LinkList &La, LinkList&Lb, LinkList&Lc) {         //链表差操作
    ElemType e;
    LinkList Lcm;
    CreateList_L(Lcm, 0);
    Intersection_L(La, Lb, Lcm);
    int La_len = Getlen_L(La);
    int Lc_len = Getlen_L(Lc);
    for (int i = 1; i <= La_len; i++) {
        GetElem_L(La, i, e);
        if (!LocateElem_L(Lcm, e))List_Insert_L(Lc, Lc_len++, e);
    }
}

void Show_L(LinkList &L) {            //打印链表所有元素
    ElemType e;
    for (int i = 1; i <= Getlen_L(L); i++) {
        GetElem_L(L, i, e);
        printf("%d ", e);
    }
    printf("\n");
}


void Sq() {
    SqList La, Lb, Lc;
    InitList_Sq(La);
    InitList_Sq(Lb);
    InitList_Sq(Lc);
    La.length = LA_INITLEN;
    Lb.length = LB_INITLEN;
    for (int i = 0; i < La.length; i++) {
        scanf("%d", &La.elem[i]);
    }
    for (int i = 0; i < Lb.length; i++) {
        scanf("%d", &Lb.elem[i]);
    }
    Union(La, Lb, Lc);
    printf("Union:\n");
    Show(Lc);

    free(Lc.elem);     //每次操作后清空Lc
    InitList_Sq(Lc);
    Intersection(La, Lb, Lc);
    printf("Intersection:\n");
    Show(Lc);

    free(Lc.elem);
    InitList_Sq(Lc);
    printf("Diff:\n");
    Diff(La, Lb, Lc);
    Show(Lc);
}

void Link() {
    LinkList La, Lb, Lc;
    CreateList_L(La, LA_INITLEN);
    CreateList_L(Lb, LB_INITLEN);
    CreateList_L(Lc, 0);
    Union_L(La, Lb, Lc);
    printf("Union:\n");
    Show_L(Lc);

    free(Lc);
    CreateList_L(Lc, 0);
    Intersection_L(La, Lb, Lc);
    printf("Intersection:\n");
    Show_L(Lc);

    free(Lc);
    CreateList_L(Lc, 0);
    Diff(La, Lb, Lc);
    printf("Diff:\n");
    Show_L(Lc);
}
int main() {
    printf("顺序表:(输入La、Lb元素)\n");
    Sq();
    printf("============\n");
    printf("链表:(输入La、Lb元素)\n");
    Link();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/realfancy/article/details/78824408