自用数据结构

线性表

线性表的抽象数据定义

ADT List{
数据对象:D={ai|ai∈ElemSet,i-1,2,....n,n≥0}
数据关系:R={<ai-1,ai>ai-1,ai∈D,i=2,...n}
基本操作:
InitList(&L);
构造一个空的线性表
Destroy(&L);
销毁线性表
ClearList(&L);
清除线性表
ListEmpty(L);
线性表是否为空
ListLength(L);
线性表的长度
GetElem(L,i,&e);
用e来返回线性表L第i个元素的值
LocateElem(L,e)
返回线性表L中第一个值与e相同的元素位置
ListInsert(&L,i,e)
在线性表L的第i个位置插入值为e的元素
ListDelete(&L,int i)
删除顺序表L中第i个元素
ListTraverse(L)
遍历输出数组
}ADT LIST

顺序表的基本操作的实现

顺序表的初始化

①为顺序表L静态/动态分配一个预定义大小的数组,使elem指向这段空间的基地址
②当前的长度设置为0

typedef struct{
ElemType data[MAXSIZE]
int length;
}
#define int ElemType 
typedef struct{
	ElemType *elem;
	int length;
}
typedef struct{
	L.elem=(ElemType *)malloc(sizeof(ElemType));
	if(!L.elem)
		exit(OVERFLOW);
	l.Length=0;
	return OK;
}

取值

①判断位置是否合理标准i(1≤i≤L.length)
②若i的值合理,将第i个的元素值L.data[i-1]赋值给e,通过e返回第i个数据元素的值

Status GetElem(L,i,&e){
	if(i<1||i>L.length||L.length==0)
		return error;
	e=L.data[i-1];
	return OK;

}

空间复杂度O(1)

查找

从第一个元素开始。即从元素下标从0开始,依次与之作比较

Status LocateElem(SqList L,ElemType e){
	for(int i=0;i<L.length;i++){
		if(L.data[i]==e)
			return i+1;
	return 0;
}}
空间复杂度O(n)

顺序表的插入

①首先判断插入的元素i的值是否是符合标准的值,这里符合标准的元素值i∈[1,n+1]
②判断元素的空间是否已满
③将第n个至第i个元素的值皆往后挪,空出第i个卫视
④将要插入的元素e放置在第i个元素下
⑤表长+1

Status ListInsert(SqList &L,int i,ElemType e){
	if(i<1||i>L.length+1||L.length==MAXSIZE)
			return error;
	for(int k=L.length-1;k>=n;k--)
	 		L.data[k+1]=L.data[k};
	 L.data[i-1]=e;
	 L.length++;
	 return OK;
}

空间复杂度O(n)

顺序表的删除

①首先判断要删除的元素的位置i是否合法,i∈[1,n]
②将i+1到n的位置都向前挪
③用e返回要删除的元素的值

Status Delete(SqList &L,int i,ElemType &e){
		if(i<1||i>L.length||L.length==0){
		 		return ERROR;
		}
		for(k=i;k<L.length;k++)
				L.data[k-1]=L.data[k];
		e=L.data[i-1];
		L.length--;
		return OK;

}

顺序表的代码实现

#include<stdio.h>
#include<stdlib.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 isEmpty(SqList L){
	if(L.length==0)
	return TRUE;
	else
	return FALSE;
}
//顺序表的清除
Status isClear(SqList &L){
	L.length=0;
	return OK;
} 
//求顺序表的长度
int ListLength(SqList L){
	return L.length;
} 
//返回第i个位置上的数据
int GetElem(SqList L,int i ,ElemType *e){
	if(i<1||i>L.length||L.length==0)
	return ERROR;
	*e=L.data[i-1];
	return OK;
	 
} 
//返回L中第1个与e满足关系的数据元素的位序。
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;
}
 
Status ListInsert(SqList &L,int i,ElemType e){
	if(i<1||i>L.length+1||L.length==MAXSIZE){
		return ERROR;
	}
  int k;
 		for(k=L.length-1;k>=i-1;k--)  /* 将要插入位置之后的数据元素向后移动一位 */
			L.data[k+1]=L.data[k];
  L.data[i-1]=e;
  L.length++;
  return OK;
} 
//顺序表删除数据
Status ListDelete(SqList &L,int i,ElemType *e){
	if(i<1||i>L.length||L.length==0)
	return ERROR;
	*e=L.data[i-1];
	if(i<=L.length){
		for(int k=i;k<L.length;k++){
					L.data[k-1]=L.data[k];
		}
	}
	L.length--;
	return OK;
} 
 

void displayTable(SqList L) {
    int i;
    for (i = 0; i < L.length; i++) {
        printf("%d ", L.data[i]);
    }
    printf("\n");
}
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))
			ListInsert(La,++La_len,e);
	}
} 

int main(){
	SqList L;
		SqList Lb;
	int i;
	ElemType e;
	int j;
	//初始化链表
	i=InitList(L);
	printf("%d\n",L.length);
    for (i = 1; i <= 5; i++) {
        L.data[i-1] = i;
         L.length++;
    }
    printf("顺序表中存储的元素分别是:\n");
    displayTable(L);
    ListInsert(L,1,8);
        printf("在顺序表中第一个插入数字8:\n");
    displayTable(L);
      ListInsert(L,2,9);
        printf("在顺序表中第二个插入数字9:\n");
    displayTable(L);
    ListDelete(L,2,&e);
       printf("在顺序表中第2个删除数字:\n");
    displayTable(L);
//        i=isEmpty(L);
//    printf("L是否空:i=%d(1:是 0:否)\n",i);
//        i=isClear(L);
//    printf("清空L后:L.length=%d\n",L.length);
    //有点类似于尾插法 
//       for(j=1;j<=5;j++)
//            i=ListInsert(&L,1,j);
//    printf("在L的表头依次插入1~5后:L.data=");
//有点类似于尾插法 
//        for(j=1;j<=10;j++)
//            ListInsert(L,j,j);
//    printf("在L的表尾依次插入1~10后:L.data=");
//     displayTable(L);
    //构造一个有10个数的Lb
	i=InitList(Lb);
    for(j=6;j<=15;j++)
            i=ListInsert(Lb,1,j);
  displayTable(Lb);
   displayTable(L);
	unionL(L,Lb); 
	printf("依次输出合并了Lb的L的元素:");
      displayTable(L);
    return 0;
}
 

上一篇:单链表


下一篇:数据结构线性表——顺序表