首页 > 代码库 > 数据结构之线性表

数据结构之线性表

 线性表是具有相同特性的数据元素的一个有限序列。该序列中所含元素的个数叫做线性表的长度,用n表示,n≥0。

  当n=0时,表示线性表是一个空表,即表中不包含任何元素。设序列中第i(i表示位序)个元素为ai(1≤i≤n)。
      线性表的一般表示为:
       (a1,a2,…ai,ai+1,…,an)

 #include <stdio.h>

#include <malloc.h>

#define MaxSize 50

typedef char ElemType;

//定义线性表

typedef struct {

 ElemType data[MaxSize];  

  int length;

} SqList;

/* *void initList(SqList *L)不行吗 ?

*当然也可以,但是此时你需要把L return出去。即SpList* initList(void),如果你用void initList(SqList *L)这种形

*式L只是接受了实参的一个副本。你对L做了修改外面的实参是不会改变的。

*由于是按值传递,那么只是函数里的局部变量L分配了空间,而全局变量L还是NULL,此时你*如果L->...,程序就崩溃了。

*而加上&,L就是实参,对L修改就是对实参修改。

*

*/

void InitList(SqList *&L) //初始化线性表,指针引用

{

 L=(SqList *)malloc(sizeof(SqList)); //分配存放线性表的空间

 L->length=0;   //置空线性表长度为0

}

void DestroyList(SqList *L)  //销毁线性表

{  

free(L);

L = NULL;//防止L成为野指针

}

bool ListEmpty(SqList *L) //判线性表是否为空表

{

 return(L->length==0);

}

int ListLength(SqList *L) //求线性表的长度

{

 return(L->length);

}

void DispList(SqList *L) //输出线性表

{

 int i;

 if (ListEmpty(L))

        return;

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

         printf("%c ",L->data[i]);

 printf("\n");

}

bool GetElem(SqList *L,int i,ElemType &e) //求线性表中某个数据元素值

{

 if (i<1 || i>L->length)

         return false;   //参数错误时返回false

 e=L->data[i-1];    //取元素值  

return true;    //成功找到元素时返回true

}

int LocateElem(SqList *L, ElemType e) //按元素值查找

{  

int i=0;

 while (i<L->length && L->data[i]!=e)

                     i++;     //查找元素e

 if (i>=L->length)   //未找到时返回0   

           return 0;

 else   return i+1;    //找到后返回其逻辑序号

}

bool ListInsert(SqList *&L,int i,ElemType e) //插入数据元素

{

 int j;

 if (i<1 || i>L->length+1)  

 return false;   //参数错误时返回false

 i--;      //将顺序表逻辑序号转化为物理序号

 for (j=L->length;j>i;j--) //将data[i]及后面元素后移一个位置   

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

L->data[i]=e;    //插入元素e  

L->length++;    //顺序表长度增1

 return true;    //成功插入返回true

}

bool ListDelete(SqList *&L,int i,ElemType &e) //删除数据元素

{  

int j;

 if (i<1 || i>L->length)  //参数错误时返回false

         return false;

 i--;      //将顺序表逻辑序号转化为物理序号

 e=L->data[i];  

for (j=i;j<L->length-1;j++) //将data[i]之后的元素前移一个位置  

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

 L->length--;    //顺序表长度减1

 return true;    //成功删除返回true

}

 

void main()
{
 SqList *L;
 ElemType e;
 printf("顺序表的基本运算如下:\n");
 printf("  (1)初始化顺序表L\n");
 InitList(L);
 printf("  (2)依次采用尾插法插入a,b,c,d,e元素\n");
 ListInsert(L,1,‘a‘);
 ListInsert(L,2,‘b‘);
 ListInsert(L,3,‘c‘);
 ListInsert(L,4,‘d‘);
 ListInsert(L,5,‘e‘);
 printf("  (3)输出顺序表L:");
 DispList(L);
 printf("  (4)顺序表L长度=%d\n",ListLength(L));
 printf("  (5)顺序表L为%s\n",(ListEmpty(L)?"空":"非空"));
 GetElem(L,3,e);
 printf("  (6)顺序表L的第3个元素=%c\n",e);
 printf("  (7)元素a的位置=%d\n",LocateElem(L,‘a‘));
 printf("  (8)在第4个元素位置上插入f元素\n");
 ListInsert(L,4,‘f‘);
 printf("  (9)输出顺序表L:");
 DispList(L);
 printf("  (10)删除L的第3个元素\n");
 ListDelete(L,3,e);
 printf("  (11)输出顺序表L:");
 DispList(L);
 printf("  (12)释放顺序表L\n");
 DestroyList(L);
}

数据结构之线性表