编辑代码

#define LISTSIZE 100              //用宏定义定义线性表的最多能保存元素的个数

typedef int DataType             //typedef的作用是为int类型起别名为DataType
typedef struct SeqList              //为结构体类型起别名为SeqList
{
    DataType data[LISTSIZE];         //使用数组作为线性表
    int nLength;                     //线性表的长度
} SeqList;

//① 初始化
void intList(SeqList *list)           //形参用结构体指针,使传过来的地址指向结构体首部
{
    list->nLength = 0;                //使&sl->list->nLength = 0;使线性表长度为0 
}

//② 判断线性表是否为空
bool listEmpty(SeqList *list)
{
    return list->nLength == 0;        //判断
}


//③ 删除线性表中的所有元素
void clearList(SeqList *list)           //形参用结构体指针,使传过来的地址指向结构体首部
{
    list->nLength = 0;                //使&sl->list->nLength = 0;使线性表长度为0 
}

//④ 获取线性表L中元素的个数
int listLength(SeqList *list)
{
    return list->nLength;
}

//⑤ 获取线性表中下标为i的元素
DataType* getNode(SeqList *list, int i)     //DataType*(int*)类型指针函数
{
    if ( i<0||i>list->nLength-1 )
        return NULL;
    return &list->data[i];                  //放回data[i]的地址
}

//⑥ 在线性表中查找指定的元素(定位)
int locateNode(SeqList *list,DataType x)
{
    int =i;
    int =j;
    for (i=0;i<list->nLength;i++)        //需要循环5次应为,因为线性表长度为5,而list->nLength表示的是nLength 的值
    {
        if(list->data[i] == x)
            return i;                   
    }
    return -1;                          //x的值不存在则返回-1
}

//⑦ 为线性表中下标为i的位置插入元素
bool insert(SeqList *list,int i,DataType x)  //布尔型函数
{
    if(list->nLength == LISTSIZE)           //如果线性表的长度已经满了,那么就不能在存了
        return false;
    int insertPosition = i;                 //定义插入变量把i的值赋予给它
    if (i < 0)                              //在线性表范围外则结构体外
        insertPosition = 0;         
    if(i>list->nLength-1)                   //在线性表范围外则结构内,线性表外(nLengtht-1:最后一个元素的下标)
        insertPosition = list->nLength;
    for(j=list->nLength-1;j>=insertPosition;j--)                  //线性表总长度为4即nLength-1
    {
        list->data[j+1]=list->data[j];      //元素往后移动一位(从倒数第一个开始挪)
    }   
    list->data[insertPosition] = x;         //在确定的位置插入元素值
    list->nLength++;                        //线性表长度增加1
    return true;
}

//⑧ 将线性表中下标为i的元素删除
bool DeleteList(SeqList *list,int i)
{
    int j;
    if (i<0 || i>=nLength)                  //不在线性表内或线性表已经满了
        return false;
    for(int j=i;list->nLength-1;j++)
    {
        list->data[i]=list->data[i+1];      //元素往前移动一位(从第一个开始挪)
    }
    list->nLength--
    return ture;
}


// 线性表的实际应用
//① 合并线性表,也就是有a,b2个表,用数学的合并:U,
//{1,5,6}U{1,5,7}={1,5,6,7}
//实际是把b的表合并到a中
viod union(SeqList *a,SeqList *b)
{
    if(a->nLength + b->nLength >LISTSIZE)   
        return 0;
    int i;
    for (i=0;i<b->nLength;i++)
    {
        DataType e =b->data[i];
        if(locateNode(a,e)==-1)            //若e的值(即data[i])的值不存在则返回-1  
        {
            insert(a,a->nLength,e);        //把e的值赋给a线性表的最后一个位置处
        }
    }
} 

//② 线性表倒置
void reverse(SeqList *list)
{
    int i;
    for(i=0;i<list->nLength/2;i++)
    {
        DataType t = list->data[i];
        list-data[i]=list->data[list->nLength-1-i];
        list->data[list->nLength-1-i] = t;
    }
}

//③ 遍历线性表
viod print(DataType d){
    printf("%d\n",d);
}
viod trave(SeqList *list,void(*visitFun)(DataType))   //void(*visitFun)(DataType)为函数指针
{
    int i;
    for (i=0;i<list->nLength;i++)
    {
        visitFun(list->data[i]);
    }
}


void main()
{
    SeqList sl;
    intList(&sl);                       //初始化后nLength为0
    
    bool tmpty = listEmpty(&sl);        //定义一个布尔变量
    //假如已经为线性表赋予了5个元素,即长度为0
    DataType *pNode = getNode($sl,3);   //向sl指向的线性表(结构体:线性表+线性表长度)中取出第4(下标为3)个元素的地址赋值给*pNode
    printf("%d",*pNode);
    
    int index = locateNode(&sl,6);      //查找线性表中6所在的位置
    printf("%d",index+i);

    insert(&sl,5,10);                   //在下标为5的位置插入一个数值10

    trave(&sl.print);
}