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

来源:互联网 发布:网络意识形态实施方案 编辑:程序博客网 时间:2024/06/06 02:22
#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;}