实验一:线性表的顺序存储结构(验证性实验)

#include<stdio.h>
#include<malloc.h>
#include<conio.h>
/*符号常量*/
#define ERROR 0
#define OK 1
#define EQUAL 1
#define OVERFLOW -1
#define LIST_INIT_SIZE 100   /* 线性表存储空间的初始分配量 */
#define LISTINCREMENT 10      /* 线性表存储空间的分配增量 */
struct STU{                    /*定义学生结构体类型,包括姓名,学号,年龄,成绩*/
    char name[20];
    char stuno[10];
    int age;
    int score;
}stu[50];
typedef struct STU ElemType;   /*用ElemType代替学生*/
struct LIST
{                       /*定义表LIST为结构体类型*/
    ElemType *elem;      /*存储空间基址*/
    int length;           /*当前长度*/
    int listsize;         /*当前分配的存储容量*/
};
typedef struct LIST List;   /*用list代表结构体LIST*/

int init(List *L)
{                            /*构造一个空的线性表*/
    L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if (!L->elem)
        exit(OVERFLOW);        /* 存储分配失败*/
    L->length=0;               /*空表长度为0*/
    L->listsize=LIST_INIT_SIZE;  /*初始存储容量*/
    return OK;
}
int Listlength(List *L)
{                      /* 求表L的长度 */
    return L->length;
}
void GetElem(List L, int i, ElemType *e)
{
    *e=L.elem[i];
}
int EqualList(ElemType *e1,ElemType *e2)
{
    if (strcmp(e1->name,e2->name)==0) /* 以元素e1,e2中的姓名项是否相等作为判定e1,e2是否相等的标准 */
        return 1;
    else
        return 0;
}
int Less_EqualList(ElemType *e1,ElemType *e2)
{                                     /* 以姓名(字符串)的≤作为判定e1≤e2的标准 */
    if (strcmp(e1->name,e2->name)<=0)
        return 1;
    else
        return 0;
}
int LocateElem(List *La,ElemType e,int type)
{                               /* 判断La中是否有与e符合关系type的元素 */
    int i;
    switch(type)
    {
	case EQUAL:
        for(i=0;i<La->length;i++)
            if (EqualList(&La->elem[i],&e))
                return 1;
            break;
	default:break;
    }
    return 0;
}

/* 合并表La,Lb,用Lc存储。已知La,Lb元素值按非递减排列,Lc中值也按非递减排列 */
void MergeList(List *La,List *Lb,List *Lc)
{
    ElemType *pa,*pb,*pc,*pa_last,*pb_last;
    pa=La->elem;pb=Lb->elem;
    Lc->listsize=Lc->length=La->length+Lb->length;
    pc=Lc->elem=(ElemType *)malloc(Lc->listsize*sizeof(ElemType));
    if (!Lc->elem)
        exit(OVERFLOW);
    pa_last=La->elem+La->length-1;
    pb_last=Lb->elem+Lb->length-1;
    while(pa<=pa_last&&pb<=pb_last)
    {                              /* 合并,Lc元素按非递减排列 */
        if (Less_EqualList(pa,pb)) *pc++=*pa++;
        else *pc++=*pb++;
    }
    while (pa<=pa_last)     /* 插入La的剩余元素 */
        *pc++=*pa++;
    while (pb<=pb_last)     /* 插入Lb的剩余元素 */
        *pc++=*pb++;
}
void UnionList(List *La ,List *Lb)
{                        /* 将所有在Lb中而不在La中的元素插入到La中 */
    int La_len,Lb_len;
    int i;
    ElemType e;
    La_len=Listlength(La);Lb_len=Listlength(Lb);    /* 求线性表长度 */
    for(i=0;i<Lb_len;i++)
    {
        GetElem(*Lb,i,&e);
        if (!LocateElem(La,e,EQUAL))
            ListInsert(La,++La_len,e);
    }
}
int printlist(List L)      /* 输入表L */
{
    int i;
    printf("name    stuno   age score\n");
    for (i=0;i<L.length;i++)
		printf("%s\t%s\t%d\t%d\n",L.elem[i].name,L.elem[i].stuno,L.elem[i].age,L.elem[i].score);
    printf("\n");
}
int ListInsert(List *L,int i,struct STU e)
{                    /* 在表L中第i位上插入e */
    struct STU *p,*q;
    if (i<1||i>L->length+1)
        return ERROR;         /* i值不合法 */
    q=&(L->elem[i-1]);
    for(p=&L->elem[L->length-1];p>=q;--p)
        *(p+1)=*p;
    *q=e;
    ++L->length;
    return OK;
}
void main()
{
    struct STU e;         /* 定义结构体变量e */
    List La,Lb,Lc;         /* 定义结构体变量,即表La,Lb,Lc */
    printf("\n\n--------List   Demo  is running ----------\n\n");
    printf("First is InsertList function.\n");
    init(&La);             /* 创建一个新表La */
    strcpy(e.name, "stu1");
    strcpy(e.stuno, "100001");
    e.age=80;
    e.score=1000;
    ListInsert(&La,1,e);     /* 在La的第1位上插入stu1的数据元素 */
    strcpy(e.name, "stu3");
    strcpy(e.stuno, "100002");
    e.age=80;
    e.score=1000;
    ListInsert(&La,2,e);    /* 在La的第2位上插入stu3的数据元素 */
    printlist(La);           /* 输出La */
    printf("List A length now is %d.\n\n",La.length);
    getch();
    strcpy(e.name, "stu5");
    strcpy(e.stuno, "100003");
    e.age=80;
    e.score=1000;
    ListInsert(&La,3,e);    /* 在表La的第3位上插入stu5的数据表 */
    printlist(La);           /* 输出表La */
    printf("List A length now is %d.\n\n",La.length);
    getch();
    init(&Lb);         /* 创建一张新表Lb */
    strcpy(e.name, "stu2");
    strcpy(e.stuno, "100001");
    e.age=80;
    e.score=1000;
    ListInsert(&Lb,1,e);      /* 在表Lb的第1位上插入stu2的数据 */
    strcpy(e.name, "stu4");
    strcpy(e.stuno, "100002");
    e.age=80;
    e.score=1000;
    ListInsert(&Lb,2,e);    /*  在表Lb的第2位上插入stu4的数据 */
    strcpy(e.name, "stu6");
    strcpy(e.stuno, "100001");
    e.age=80;
    e.score=1000;
    ListInsert(&Lb,3,e);     /*  在表Lb的第3位上插入stu6的数据 */
    printlist(Lb);           /* 输出表Lb */
    printf("List B length now is %d.\n\n",Lb.length);
    getch();
    MergeList(&La,&Lb,&Lc);     /* 合并表La,Lb,用表Lc存储(非递减有序) */
    printlist(Lc);              /* 输出表Lc */
    getch();
    printf("Second is UnionList function.\n ");
    printf("Now Union List A and List B---\n ");
    UnionList(&La,&Lb);     /* 合并La,Lb,并删除值相同的元素,用La存储 */
    printlist(La);         /* 输出La */
    printf("List A length now is %d.\n\n ",La.length);
    getch();
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值