配色: 字号:
顺序表的基本运算
2016-09-18 | 阅:  转:  |  分享 
  
顺序表的基本运算

[html]viewplaincopy

问题描述及代码:

[cpp]viewplaincopy

1./

2.烟台大学计控学院

3.作者:朱建豪

4.完成日期:2016年9月17日

5.问题描述:在数据结构的学习中,掌握基本运算是一个基础性的工作。这种“抽象”级别的成果,适用于各种应用场合,也是训练计算思维的根本依托之一。

6.(1)初始化线性表InitList(&L):构造一个空的线性表L

7.(2)销毁线性表DestroyList(&L):释放线性表L占用的内存空间

8.(3)判线性表是否为空表ListEmpty(L):若L为空表,则返回真,否则返回假

9.(4)求线性表的长度ListLength(L):返回L中元素个数

10.(5)输出线性表DispList(L):当线性表L不为空时,顺序显示L中各节点的值域

11.(6)求线性表L中指定位置的某个数据元素GetElem(L,i,&e):用e返回L中第i个元素的值

12.(7)查找元素LocateElem(L,e):返回线性表L中第1个与e相等的序号,找不到返回0

13.(8)插入元素ListInsert(&L,i,&e):在线性表L中的第i个位置插入元素e;

14.(9)删除元素ListDelete(&L,i,&e):在线性表L中删除第i个元素,有e返回删除的值;

15./

(1)目的是要测试“建立线性表”的算法CreateList,为查看建表的结果,需要实现“输出线性表”的算法DispList。在研习DispList中发现,要输出线性表,还要判断表是否为空,这样,实现判断线性表是否为空的算法ListEmpty成为必要。这样,再加上main函数,这个程序由4个函数构成。main函数用于写测试相关的代码。

[cpp]viewplaincopy

1.#include

2.#include

3.#defineMaxsize50

4.typedefintElemType;

5.typedefstruct

6.{

7.ElemTypedata[Maxsize];

8.intlength;

9.}SqList;

10.//自定义函数声明部分

11.voidCreatList(SqList&L,ElemTypea[],intn);//用数组创建线性表

12.voidDispList(SqListL);//输出线性表DisList(L)

13.boolListEmpty(SqListL);//判断是否为空表ListEmpty(L)

14.//实现测试函数

15.intmain()

16.{

17.SqListsq;

18.ElemTypex[6]={5,8,7,2,4,9};

19.CreatList(sq,x,6);

20.DispList(sq);

21.return0;

22.}

23.//实现自定义函数

24.voidCreatList(SqList&L,ElemTypea[],intn)//用数组创建线性表

25.{

26.inti;

27.L=(SqList)malloc(sizeof(SqList));

28.for(i=0;i
29.L->data[i]=a[i];

30.L->length=n;

31.}

32.voidDispList(SqListL)//输出线性表DisList(L)

33.{

34.inti;

35.for(i=0;ilength;i++)

36.printf("%d",L->data[i]);

37.printf("\n");

38.}

39.boolListEmpty(SqListL)//判断是否为空表ListEmpty(L)

40.{

41.return(L->length==0);

42.}



运行结果:



(2)在已经创建线性表的基础上,求线性表的长度ListLength、求线性表L中指定位置的某个数据元素GetElem、查找元素LocateElem的算法都可以实现了。就在原程序的基础上增加:

增加求线性表的长度ListLength的函数并测试;?

增加求线性表L中指定位置的某个数据元素GetElem的函数并测试;?

增加查找元素LocateElem的函数并测试?

1.head.h的代码

[cpp]viewplaincopy

1.#include

2.#include

3.#defineMaxsize50

4.typedefintElemType;

5.typedefstruct

6.{

7.ElemTypedata[Maxsize];

8.intlength;

9.}SqList;

10.//自定义函数声明部分

11.voidCreatList(SqList&L,ElemTypea[],intn);//用数组创建线性表

12.voidDispList(SqListL);//输出线性表DisList(L)

13.boolListEmpty(SqListL);//判断是否为空表ListEmpty(L)

14.intListLength(SqListL);//求线性表的长度ListLength(L)

15.boolGetElem(SqListL,inti,ElemType&e);//求某个数据元素值GetElem(L,i,e)

16.intLocateElem(SqListL,ElemTypee);//按元素值查找LocateElem(L,e)



2.main.cpp中的代码

[cpp]viewplaincopy

1.#include"head.h"

2.//实现测试函数

3.intmain()

4.{

5.SqListsq;

6.ElemTypex[6]={5,8,7,2,4,9};

7.CreatList(sq,x,6);

8.DispList(sq);

9.ElemTypea;

10.intloc;

11.

12.printf("表长度:%d\n",ListLength(sq));//测试求长度

13.

14.if(GetElem(sq,3,a))//测试在范围内的情形

15.printf("找到了第3个元素值为:%d\n",a);

16.else

17.printf("第3个元素超出范围!\n");

18.

19.if(GetElem(sq,15,a))//测试不在范围内的情形

20.printf("找到了第15个元素值为:%d\n",a);

21.else

22.printf("第15个元素超出范围!\n");

23.

24.if((loc=LocateElem(sq,8))>0)//测试能找到的情形

25.printf("找到了,值为8的元素是第%d个\n",loc);

26.else

27.printf("值为8的元素木有找到!\n");

28.

29.if((loc=LocateElem(sq,17))>0)//测试不能找到的情形

30.printf("找到了,值为17的元素是第%d个\n",loc);

31.else

32.printf("值为17的元素木有找到!\n");

33.

34.return0;

35.

36.}

3.创建线性表的基础代码

[cpp]viewplaincopy

1.//自定义函数声明部分

2.voidCreatList(SqList&L,ElemTypea[],intn);//用数组创建线性表

3.voidDispList(SqListL);//输出线性表DisList(L)

4.boolListEmpty(SqListL);//判断是否为空表ListEmpty(L)

5.

6.//实现自定义函数

7.voidCreatList(SqList&L,ElemTypea[],intn)//用数组创建线性表

8.{

9.inti;

10.L=(SqList)malloc(sizeof(SqList));

11.for(i=0;i
12.L->data[i]=a[i];

13.L->length=n;

14.}

15.voidDispList(SqListL)//输出线性表DisList(L)

16.{

17.inti;

18.for(i=0;ilength;i++)

19.printf("%d",L->data[i]);

20.printf("\n");

21.}

22.boolListEmpty(SqListL)//判断是否为空表ListEmpty(L)

23.{

24.return(L->length==0);

25.}

26.

27.





4.查找,求长度等的代码

[cpp]viewplaincopy

1.#include"head.h"

2.//实现测试函数

3.intListLength(SqListL)//求线性表的长度ListLength(L)

4.{

5.return(L->length);

6.}

7.boolGetElem(SqListL,inti,ElemType&e)//求某个数据元素值GetElem(L,i,e)

8.{

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

10.returnfalse;

11.e=L->data[i-1];

12.returntrue;

13.}

14.intLocateElem(SqListL,ElemTypee)//按元素值查找LocateElem(L,e)

15.{

16.inti=0;

17.while(ilength&&L->data[i]!=e)

18.i++;

19.if(i>=L->length)

20.return0;

21.else

22.returni+1;

23.}



运行结果:

[html]viewplaincopy





(3)其余的4个基本运算:插入数据元素ListInsert、删除数据元素ListDelete、初始化线性表InitList、销毁线性表DestroyList都可以同法完成。

1.初始化及插入的代码

[cpp]viewplaincopy

1.#include

2.#include

3.#defineMaxsize50

4.typedefintElemType;

5.typedefstruct

6.{

7.ElemTypedata[Maxsize];

8.intlength;

9.}SqList;

10.//自定义函数声明部分

11.voidCreatList(SqList&L,ElemTypea[],intn);//用数组创建线性表

12.voidDispList(SqListL);//输出线性表DisList(L)

13.boolListEmpty(SqListL);//判断是否为空表ListEmpty(L)

14.voidInitList(SqList&L);//初始化线性表

15.boolListInsert(SqList&L,inti,ElemTypee);//插入数据元素

16.voidCreatList(SqList&L,ElemTypea[],intn)//用数组创建线性表

17.{

18.inti;

19.L=(SqList)malloc(sizeof(SqList));

20.for(i=0;i
21.L->data[i]=a[i];

22.L->length=n;

23.}

24.voidDispList(SqListL)//输出线性表DisList(L)

25.{

26.inti;

27.for(i=0;ilength;i++)

28.printf("%d",L->data[i]);

29.printf("\n");

30.}

31.boolListEmpty(SqListL)//判断是否为空表ListEmpty(L)

32.{

33.return(L->length==0);

34.}

35.

36.voidInitList(SqList&L)//初始化线性表

37.{

38.L=(SqList)malloc(sizeof(SqList));

39.L->length=0;

40.}

41.boolListInsert(SqList&L,inti,ElemTypee)//插入数据元素

42.{

43.intj;

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

45.returnfalse;

46.i--;

47.for(j=L->length;j>i;j--)

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

49.L->data[i]=e;

50.L->length++;

51.returntrue;

52.}

53.intmain()

54.{

55.SqListsq;

56.InitList(sq);

57.ListInsert(sq,1,5);

58.ListInsert(sq,2,3);

59.ListInsert(sq,1,4);

60.DispList(sq);

61.return0;

62.}



运行结果:

[html]viewplaincopy



[html]viewplaincopy

2.删除及销毁的代码

[cpp]viewplaincopy

1.#include

2.#include

3.#defineMaxsize50

4.typedefintElemType;

5.typedefstruct

6.{

7.ElemTypedata[Maxsize];

8.intlength;

9.}SqList;

10.//自定义函数声明部分

11.voidCreatList(SqList&L,ElemTypea[],intn);//用数组创建线性表

12.voidDispList(SqListL);//输出线性表DisList(L)

13.boolListEmpty(SqListL);//判断是否为空表ListEmpty(L)

14.voidInitList(SqList&L);//初始化线性表

15.boolListInsert(SqList&L,inti,ElemTypee);//插入数据元素

16.boolListDelete(SqList&L,inti,ElemType&e);//删除数据元素

17.voidDestroyList(SqList&L);//销毁线性表

18.voidCreatList(SqList&L,ElemTypea[],intn)//用数组创建线性表

19.{

20.inti;

21.L=(SqList)malloc(sizeof(SqList));

22.for(i=0;i
23.L->data[i]=a[i];

24.L->length=n;

25.}

26.voidDispList(SqListL)//输出线性表DisList(L)

27.{

28.inti;

29.for(i=0;ilength;i++)

30.printf("%d",L->data[i]);

31.printf("\n");

32.}

33.boolListEmpty(SqListL)//判断是否为空表ListEmpty(L)

34.{

35.return(L->length==0);

36.}

37.

38.voidInitList(SqList&L)//初始化线性表

39.{

40.L=(SqList)malloc(sizeof(SqList));

41.L->length=0;

42.}

43.boolListInsert(SqList&L,inti,ElemTypee)//插入数据元素

44.{

45.intj;

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

47.returnfalse;

48.i--;

49.for(j=L->length;j>i;j--)

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

51.L->data[i]=e;

52.L->length++;

53.returntrue;

54.}

55.boolListDelete(SqList&L,inti,ElemTypee)//删除数据元素

56.{

57.intj;

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

59.returnfalse;

60.i--;

61.e=L->data[i];

62.for(j=i;jlength-1;j++)

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

64.L->length--;

65.returntrue;

66.}

67.voidDestroyList(SqList&L)

68.{

69.free(L);

70.}

71.intmain()

72.{

73.SqListsq;

74.InitList(sq);

75.ListInsert(sq,1,5);

76.ListInsert(sq,2,3);

77.ListInsert(sq,1,4);

78.printf("插入后的:\n");

79.DispList(sq);

80.ListDelete(sq,1,5);

81.ListDelete(sq,2,3);

82.printf("删除后的:\n");

83.DispList(sq);

84.

85.DestroyList(sq);

86.printf("销毁后的:\n");

87.DispList(sq);

88.return0;

89.

90.}



运行结果:

[html]viewplaincopy





知识点总结:

实现线性表的基本运算:(1)初始化线性表InitList(&L):构造一个空的线性表L(2)销毁线性表DestroyList(&L):释放线性表L占用的内存空间(3)判线性表是否为空表ListEmpty(L):若L为空表,则返回真,否则返回假(4)求线性表的长度ListLength(L):返回L中元素个数(5)输出线性表DispList(L):当线性表L不为空时,顺序显示L中各节点的值域(6)求线性表L中指定位置的某个数据元素GetElem(L,i,&e):用e返回L中第i个元素的值(7)查找元素LocateElem(L,e):返回线性表L中第1个与e相等的序号,找不到返回0。(8)插入数据元素ListInsert(SqList&L,inti,ElemTypee):在L的第i个元素之前插入新的元素e,L的长度增加1;(9)删除数据元素ListDele(&L,i,&e):删除L的第i个数据元素,并用e返回其值,L的长度减1;(10)销毁线性表DestroyList(SqList&L):释放线性表L占用的内存空间;

学习心得:

这是个庞大的工程啊,我刚开始使用的程序的多文件组织来写的,可是因为好几个主函数不能通用,最后就又建了个工程来写,我还是喜欢自己敲代码的过程,虽然很慢很累,但是我可以在敲代码的过程中真正理解了这个算法。今天的收获很大!

献花(0)
+1
(本文系网络学习天...首藏)