【项目1 - 顺序表的基本运算】
(1)无从下手时,要找到参考,这是要“借力”;(2)找到参考,并未解决问题,观摩之后,丢开参考,自行完成,这是根本的目标。用这样的“抄之有道”,抄来的在心里,最终的成果,来自你的心中、脑中和手中。
(2)在已经创建线性表的基础上,求线性表的长度ListLength、求线性表L中指定位置的某个数据元素GetElem、查找元素LocateElem的算法都可以实现了。就在原程序的基础上增加:
增加求线性表的长度ListLength的函数并测试;
增加求线性表L中指定位置的某个数据元素GetElem的函数并测试;
增加查找元素LocateElem的函数并测试;
(3)其余的4个基本运算:插入数据元素ListInsert、删除数据元素ListDelete、初始化线性表InitList、销毁线性表DestroyList都可以同法完成,请自行安排实践路线。
代码如下
list.h
#define MaxSize 50
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize];
int length;
}Sqlist;
void CreateList(Sqlist *&L, int i,ElemType a[]);//用数组创建线性表
void DispList(Sqlist *L);//输出线性表
bool ListEmpty(Sqlist *L);//判断线性表是否为空
int ListLength(Sqlist *L);//求线性表的长度
int GetElem(Sqlist *L, int i);//求指定位置的数据元素
bool LocateElem(Sqlist *L, int x);//查找元素
bool ListInsert(Sqlist *&L, int i, int x);//插入数据元素
bool ListDelete(Sqlist *&L, int x);//删除数据元素
void InitList(Sqlist *&L);//初始化线性表
void DestroyList(Sqlist *&L);//销毁线性表
#endif
list.cpp
#include <stdio.h>
#include <malloc.h>
#include "list.h"
//用数组创建线性表
void CreateList(Sqlist *&L,int n,ElemType a[])
{
int i;
L = (Sqlist *)malloc(sizeof(ElemType));
L->length = n;
for ( i = 0; i < L->length; i++)
{
L->data[i] = a[i];
}
}
//输出线性表
void DispList(Sqlist *L)
{
int i;
if (ListEmpty(L))
{
return;
}
for (i = 0; i < L->length; i++)
{
printf("%d", L->data[i]);
}
//return 0;
}
//判断线性表是否为空
bool ListEmpty(Sqlist *L)
{
if (L->length == 0)
{
return true;
}
else
{
return false;
}
}
//求线性表的长度
int ListLength(Sqlist *L)
{
if (ListEmpty(L))
{
return 0;
}
else
{
return L->length;
}
}
//求指定位置的数据元素
int GetElem(Sqlist *L, int i)
{
if (ListEmpty(L)&&(i<1||i>L->length))//if(ListEmpty(L));
{
return 0;
}
return L->data[i-1];
}
//查找元素
bool LocateElem(Sqlist *L, int x)
{
for (int i=0 ; i < L->length; i++)
{
if (L->data[i] == x)
return true;
else
return false;
}
}
//插入数据元素
bool ListInsert(Sqlist *&L, int i, int x)
{
//判断是否存在
if (i<1 || i>L->length+1)//思维不严密写成i<1||i>L->length,没考虑到尾的特殊情况
{
return false;
}
i--;
for (int j = L->length; j > i; j--)
{
L->data[j] = L->data[j - 1];
}
L->data[i] = x;
L->length++;
return true;
}
//删除特定数据元素值
bool ListDelete(Sqlist *&L, int x)
{
int i = 0;
if(ListEmpty(L))
{
return false;
}
while (i < L->length )
{
if (L->data[i] == x)
break;
i++;
}
for ( int j = i; j < L->length; j++)
{
L->data[j] = L->data[j + 1];
}
L->length--;
return true;
}
//初始化线性表
void InitList(Sqlist *&L)
{
L = (Sqlist *)malloc(sizeof(ElemType));//漏掉了
L->length = 0;
printf("\n此线性表初始化完毕。");
}
//销毁线性表
void DestroyList(Sqlist *&L)
{
free(L);//没想起来
printf("\n此线性表销毁完毕。");
}
main.cpp