线性表(顺序表和链式表)
来源:互联网 发布:网络意识形态实施方案 编辑:程序博客网 时间: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;}
阅读全文
0 0
- 线性表(顺序表和链式表)
- 线性表(顺序存储,链式存储)
- 线性表的顺序和链式存储结构
- 线性表的顺序存储和链式存储
- 数据结构——线性表(顺序结构和链式结构)
- 线性表中顺序存储和链式存储
- 线性表包括顺序存储结构和链式存储结构
- 线性表顺序实现和链式实现区别
- 线性表之顺序存储结构和链式存储结构
- 线性表的顺序存储和链式存储
- 线性表的顺序存储和链式存储差异
- 线性表的顺序存储实现和链式存储实现
- 线性表(顺序存储/链式存储)
- 数据结构 --- 线性表 顺序储存 链式储存
- 线性表的链式表示和实现(链式)
- 数据结构--线性表(顺序实现,链式实现,多项式计算)
- 顺序存储(数组)和链式存储(指针)的比较以及线性表小解义
- 线性表_顺序存储结构和链式存储结构的优缺点比较(区别)
- 设计模式六大原则(1):单一职责原则
- 现汉语语法和体系学习笔记
- avcodec_open(pCodecCtx, pCodec
- Eclipse转Android studio运行时等问题 编码乱码 閿欒: 缂栫爜UTF-8鐨勪笉鍙槧灏勫瓧绗?
- java语言概述
- 线性表(顺序表和链式表)
- php获取客户端IP和php获取服务器端IP
- 对称矩阵压缩和三种解压缩方式
- 【UVa1152】4 Values whose Sum is 0 模拟
- Pandas
- startActivityForResult回传值
- 小泉的难题
- 明黄色一代-亿唐网的没落
- c++ poco Mutex相关 源码剖析