// main.c
// List
//
// Created by Jacobs.Guo on 2018/4/1.
// Copyright © 2018年 yage guo. All rights reserved.
//
#include <stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int status;
typedef int ElemType;
typedef struct{
ElemType data[MAXSIZE];
int length;
}Sqlist;
//初始化线性表
status InitList(Sqlist *l){
l->length = 0;
return OK;
}
//线性表插入元素
status InsertList(Sqlist *l,ElemType e,int position){
// printf("值为%d...%d\n",position,e);
int k;
if (l->length == MAXSIZE)
return FALSE;
if (position<1 || position>l->length+1)
return FALSE;
if (position <= l->length){
for (k = l->length-1 ; k >= position-1 ; k--){
l->data[k+1] = l->data[k];
}
}
l->data[position-1] = e;
l->length++;
return OK;
}
//获取线性表的长度
int ListLength(Sqlist *L){
return L->length;
}
//判断线性表是否为空表
status ListEmpty(Sqlist *L){
if (L->length ==0)
return TRUE;
else
return FALSE;
}
//将线性表置为空表
status ClearList(Sqlist *L){
L->length = 0;
return OK;
}
//获取线性表中的元素
ElemType GetElem(Sqlist *L,int position,ElemType *e){
if ( position==0 || position<1 || position>L->length)
return ERROR;
*e = L->data[position-1];
return OK;
}
//ListDelete 删除线性表元素
status ListDelete (Sqlist *L,int position){
int k;
if (position<1 || position >L->length)
return ERROR;
if (position != L->length){
for (k = position-1;k<L->length-1;k++){
L->data[k] = L->data[k+1];
}
}
L->length--;
return OK;
}
//ListTraverse 遍历线性表
status ListTraverse(Sqlist *L){
int i;
if (L->length == 0) return ERROR;
for (i = 0; i<=L->length-1;i++)
printf("%d...",L->data[i]);
printf("\n");
return OK;
}
/* 初始条件:顺序线性表L已存在 */
/* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0 */
int LocateElem(Sqlist L,ElemType e)
{
int i;
if (L.length==0)
return 0;
for(i=0;i<L.length;i++)
{
if (L.data[i]==e)
break;
}
if(i>=L.length)
return 0;
return i+1;
}
//合并两个线性表
void UnionL(Sqlist *La,Sqlist *Lb){
int La_len,Lb_len,i;
ElemType e;
La_len=ListLength(La);
Lb_len=ListLength(Lb);
for (i=1;i<=Lb_len;i++)
{
GetElem(Lb,i,&e);
if (!LocateElem(*La,e))
// printf("值为%d...%d\n",La_len,e);
InsertList(La,e,++La_len);
}
}
int main(){
Sqlist L,La;
int i;
ElemType e;
//初始化线性表
if (InitList(&L)) printf("线性表L初始化已完成....\n");
if (InitList(&La)) printf("线性表La初始化已完成....\n");
//线性表是否为空
if(ListEmpty(&L)) printf("线性表L为空表\n");
else printf("线性表L非空\n");
if(ListEmpty(&La)) printf("线性表La为空表\n");
else printf("线性表La非空\n");
for (i = 1; i <= 5 ; i++){
InsertList(&L, i, 1);
}
printf("在L线性表头部一次插入1-5之后:线性表的元素为...\n");
printf("线性表的长度为:%d\n",ListLength(&L));
ListTraverse(&L);
for (i = 1; i <= 6 ; i++){
InsertList(&La, i+2, 1);
}
printf("在La线性表头部一次插入1-5之后:线性表的元素为...\n");
printf("线性表的长度为:%d\n",ListLength(&La));
ListTraverse(&La);
printf("在L线性表中第三个位置插入元素10之后:线性表的元素为\n");
InsertList(&L, 10, 3);
ListTraverse(&L);
if(ListEmpty(&L)) printf("线性表L为空表\n");
else printf("线性表L非空\n");
if (!GetElem(&L,3,&e)) printf("不能找到对应的元素\n");
else printf("线性表中第4个元素值为:%d\n",e);
printf("在L线性表中删除第三个位置的元素之后:线性表的元素序列为\n");
ListDelete(&L, 3);
ListTraverse(&L);
printf("将线性表La与表L合并后结果为:\n");
UnionL(&L, &La);
ListTraverse(&L);
printf("元素8所在的位置是:%d\n",LocateElem(L,8));
// 将线性表置为空表
ClearList(&L);
printf("线性表L已经置空....\n");
return 0;
}