#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
今日推荐
周排行