您的位置:首页 > 理论基础 > 数据结构算法

《大话数据结构》读书笔记之线性表基本操作(数组实现)

2014-09-08 16:09 429 查看
/*
Name: 线性表抽象数据类型(使用数组实现) 
Copyright: 
Author: 巧若拙 
Date: 08-09-14 14:38
Description: 

*/

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

#include<math.h>

#define MAXSIZE 10

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0 

typedef int ElemType;

typedef int Status; //函数类型,其值是函数结果状态代码,如OK等 

typedef struct{
ElemType data[MAXSIZE];//数组存储线性表元素 
int length;//线性表元素个数,即线性表长度 

} SqList;

Status InitList(SqList *L);//建立一个空的线性表L 

Status ListEmpty(SqList L);//若线性表为空,返回TRUE,否则返回FALSE

Status ClearList(SqList *L);//将线性表清空 

int ListLength(SqList L);//返回线性表L的元素个数 

Status DisplayList(SqList L);//输出线性表L的所有元素

Status GetElem(SqList L, int i, ElemType *e);//将线性表L中第i个位置元素值赋给e 

Status LocateElem(SqList L, ElemType e);//在线性表L中查找是否存在与给定值e相等的元素

Status ListInsert(SqList *L, int i, ElemType e);//在线性表L中的第i个位置插入新元素e 

Status ListDelete(SqList *L, int i, ElemType *e);//删除线性表L中的第i个位置,并将该元素值赋给e 

Status ListSort(SqList *L);//给线性表L排序 

int main(void)

{

    SqList a;

    ElemType *p, e = 0;

    int i;

    

    InitList(&a);//建立一个空的线性表

    

    for (i=0; i<MAXSIZE; i++)

    {

    ListInsert(&a, i+1, i+100);

    }

    

    DisplayList(a);

    

    for (i=1; i<ListLength(a); i+=2)

    {

    ListDelete(&a, i, &e);//删除线性表L中的第i个位置,并将该元素值赋给e 

    }

    printf("e = %d\n", e);

    

    DisplayList(a);

    

    i = 5;

    e = 50;

    if (LocateElem(a, e))//在线性表L中查找是否存在与给定值e相等的元素

    {

    printf("存在%d\n", e);

    }

    else

    {

    printf("不存在%d\n", e);

    ListInsert(&a, i, e);

    }

    

    DisplayList(a);

    

    ListSort(&a);//给线性表L排序 

    DisplayList(a);

    return 0;

}

/*

函数功能:建立一个空的线性表L 

初始条件:无

操作结果:初始化线性表L。操作成功返回OK,否则返回ERROR  

*/

Status InitList(SqList *L)

{
L->length = 0;

return OK;



/*

函数功能:判断线性表是否为空

初始条件:顺序线性表L已经存在

操作结果:若线性表为空,返回TRUE,否则返回FALSE 

*/

Status ListEmpty(SqList L)

{
return (L.length == 0) ? TRUE : FALSE;

}

/*

函数功能:将线性表清空 

初始条件:顺序线性表L已经存在

操作结果:将线性表清空。操作成功返回OK,否则返回ERROR  

*/

Status ClearList(SqList *L)

{
if (L == NULL)
{
return ERROR;
}

L->length = 0;
return OK;

}

/*

函数功能:返回线性表L的元素个数 

初始条件:顺序线性表L已经存在

操作结果:返回线性表L的元素个数 

*/

int ListLength(SqList L)

{
return L.length;

}

/*

函数功能:输出线性表L的所有元素

初始条件:顺序线性表L已经存在

操作结果:输出线性表L的所有元素。操作成功返回OK,否则返回ERROR 

*/

Status DisplayList(SqList L)

{
int i;

if (L.length == 0)
{
printf("none!\n");

return ERROR;
}

for (i=0; i<ListLength(L); i++)

    {

    printf("data[%d] = %d, ", i, L.data[i]);

    }

    printf("\n");

    return OK;

}

/*

函数功能:将线性表L中第i个位置元素值赋给e 

初始条件:顺序线性表L已经存在,1 <= i <= ListLength(L);

操作结果:将线性表L中第i个位置元素值赋给e。操作成功返回OK,否则返回ERROR 

*/

Status GetElem(SqList L, int i, ElemType *e)

{
if (L.length == 0 || i < 1 || i > L.length)
{
return ERROR;
}

*e = L.data[i-1];
return OK;

}

/*

函数功能:在线性表L中查找是否存在与给定值e相等的元素

初始条件:顺序线性表L已经存在

操作结果:在线性表L中查找是否存在与给定值e相等的元素。找到返回TRUE,否则返回FALSE 

*/

Status LocateElem(SqList L, ElemType e)

{
int i;

for (i=0; i<L.length; i++)
{
if (L.data[i] == e)
{
return TRUE;
}
}

return FALSE;



/*

函数功能:在线性表L中的第i个位置插入新元素e 

初始条件:顺序线性表L已经存在,1 <= i <= ListLength(L);

操作结果:在线性表L中的第i个位置插入新元素e,L的长度加1。操作成功返回OK,否则返回ERROR  

*/

Status ListInsert(SqList *L, int i, ElemType e)

{
int k;

if (L->length == MAXSIZE || i < 1 || i > L->length+1)
{
return ERROR;
}

for (k=L->length; k>=i; k--)
{
L->data[k] = L->data[k-1];
}

L->data[k] = e;
L->length++;

return OK;

}

/*

函数功能:删除线性表L中的第i个位置,并将该元素值赋给e 

初始条件:顺序线性表L已经存在,1 <= i <= ListLength(L);

操作结果:删除线性表L中的第i个位置,并将该元素值赋给e,L的长度减1。

操作成功返回OK,否则返回ERROR  

*/

Status ListDelete(SqList *L, int i, ElemType *e)

{
int k;

if (L->length == 0 || i < 1 || i > L->length)
{
return ERROR;
}

*e = L->data[i-1];

for (k=i; k<L->length; k++)
{
L->data[k-1] = L->data[k];
}

L->length--;

return OK;

}

/*

函数功能:给线性表L排序 

初始条件:顺序线性表L已经存在

操作结果:使线性表L元素按非递减排列。操作成功返回OK,否则返回ERROR  

*/

Status ListSort(SqList *L) //基本插入排序 

{

    int i, j;

    ElemType temp;

     

    if (L->length == 0)
{
return ERROR;
}

    for (i=1; i<L->length; i++)

    {

    temp = L->data[i];

      for (j=i;(j>0) && (L->data[j-1]>temp); j--)

      {

      L->data[j] = L->data[j-1];

      }

      L->data[j] = temp;

    }

    

    return OK;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: