第三周-项目1 - 顺序表的基本运算

来源:互联网 发布:单片机与串口调试助手 编辑:程序博客网 时间:2024/05/20 17:59
#include <stdio.h>//必要的库文件包括#include <malloc.h>#define MaxSize 50   //必要的宏定义                     //声明实现算法的自定义函数,以及其他必要的自定义函数typedef int ElemType;//将ElemType定义为int类型typedef struct//用来存储顺序表的结构体Sq{ElemType data[MaxSize];//定义一个数组用来存储,int型int length;//顺序表的长度}SqList;bool ListEmpty(SqList *L);//———————————————判断线性表是否为空ListEmptyvoid DispList(SqList *&L);//———————————————输出线性表DispListvoid CreateList(SqList *&L,ElemType a[],int n);//———— 1.建立线性表CreateListvoid InitList(SqList * &L);//—————————————— 2.初始化线性表InitListvoid DestroyList(SqList * &L);//—————————————3.销毁线性表DestroyListbool ListInsert(SqList *&L,int i,ElemType &e);//—————4.插入数据元素ListInsertbool ListDelete(SqList *&L,int i,ElemType &e);//—————5.删除数据元素ListDeleteint ListLength(SqList *&L);//—————————————— 6.求线性表的长度ListLength的bool GetElem(SqList *&L,int i,ElemType &e);//—————— 7.求线性表L中指定位置(e)的某个数据元素GetElemint LocateElem(SqList *&L,ElemType e);//—————————8.查找元素LocateElem//定义用于驱动测试的main函数int main(){int i;ElemType e;SqList *sq;//定义一顺序表,结构体ElemType x[6]={1,2,3,4,5,6};//定义一个数组并赋值//1.    CreateList(sq, x, 6);//调用“建立线性表”    DispList(sq);//调用“输出线性表”ListEmpty(sq);//判断线性表是否为空//2.InitList(sq);//初始化线性表DispList(sq);//调用“输出线性表”//3.CreateList(sq, x, 6);//调用“建立线性表”DestroyList(sq);//销毁线性表DispList(sq);//调用“输出线性表”//4.i=2;e=5;CreateList(sq, x, 6);//调用“建立线性表”ListInsert(sq,i,e);//插入数据元素DispList(sq);//调用“输出线性表”//5.ListDelete(sq,i,e);//删除数据元素DispList(sq);//调用“输出线性表”//6.int l;l=ListLength(sq);//求线性表的长度printf("%d ",l);printf("\n");//7.int n;GetElem(sq,i,n);//求线性表L中指定位置(e)的某个数据元素printf("%d ",n);printf("\n");//8.int m;m=LocateElem(sq,e);//查找元素printf("%d ",m);printf("\n");    return 0;}//定义各个自定义函数void CreateList(SqList *&L,ElemType a[],int n)//————————1.“建立线性表”的算法CreateList{int i;L=(SqList *)malloc(sizeof(SqList));//分配空间for(i=0;i<n;i++)//把数组的值赋予线性表L->data[i]=a[i];L->length=n;//赋予表长}bool ListEmpty(SqList *L)//——————————实现判断线性表是否为空的算法ListEmpty{if(L->length==0){printf("线性表为空\n");return true;}else return false;}void DispList(SqList *&L)//——————————实现“输出线性表”的算法DispList{int i;if(ListEmpty(L))//判断是不是空表return;for (i=0; i<L->length; i++) //输出         printf("%d ",L->data[i]);      printf("\n");  //换行}void InitList(SqList * &L)//————————————2.初始化线性表InitList{L=(SqList *)malloc(sizeof(SqList));L->length=0;}void DestroyList(SqList * &L)//————————————3.销毁线性表DestroyList{free(L);}bool ListInsert(SqList *&L,int i,ElemType &e)//————————————4.插入数据元素ListInsert{if(i<1||i>L->length)return false;i--;for(int j=L->length;j>i;j--){L->data[j]=L->data[j-1];}L->length++;L->data[i]=e;return true;}bool ListDelete(SqList *&L,int i,ElemType &e)//————————————5.删除数据元素ListDelete{if(i<1||i>L->length)return false;i--;e=L->data[i];for(int j=i;j<L->length-1;j++)L->data[j]=L->data[j+1];L->length--;return true;}int ListLength(SqList *&L)//————————————6.增加求线性表的长度ListLength的函数{return(L->length);}bool GetElem(SqList *&L,int i,ElemType &e)//————————————7.增加求线性表L中指定位置(e)的某个数据元素GetElem的函数{if(i<1||i>L->length)return false;e=L->data[i-1];return true;}int LocateElem(SqList *&L,ElemType e)//————————————8.增加查找元素LocateElem的函数{int i=0;while(i<L->length&&L->data[i]!=e)i++;if(i>=L->length)return 0;elsereturn i+1;}


小结:从运行结果来看,第一行成功的建立了一个顺序表,并进行了输出。第二行对已经行初始化的顺序表进行输出,在判断线性表是否为空的函数中加入了如果为空则输出“线性表为空”的指令,所以第二行的输出证明初始化也是成功的。第三行进行了销毁线性表的操作,从结果什么都没有来看,销毁和初始化是并不一样的。第四行进行了插入操作,在第二的位置插入一个5。第五行则是删除上一步增加的5。倒数第三行输出的6为线性表长度,倒数第二行为查看第二个位置上的元素(其中用到了引用作为形参),最后一行为查找5在第几个位置(直接返回值)。各种操作均有非常巧妙的地方。

0 0