user-0 提问: 线性表的基本操作的顺序表示及实现

回复:
user: user-1
content: C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 供参考：https://blog.csdn.net/bzhxuexi/article/details/19088667?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161762532616780265418035%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161762532616780265418035&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-3-19088667.pc_search_result_cache&utm_term=c%E8%AF%AD%E8%A8%80%E5%BD%A2%E5%8F%82%E9%BB%98%E8%AE%A4%E5%80%BC

user: user-2
content: //以下三个函数最后一个形参可以不用，这里偷懒，均设了个初值 //Status GetELem(SqList L, int i, int e=0); //Status PriorElem(SqList L, int cur_e, int pri_e=0); //Status NextElem(SqList L, int cur_e, int Nex_e=0);第一个问题，这三个函数均是三个形参的设计，功能是找到元素本身及前驱和后驱元素，均有返回值，返回值可以通过函数名返回，并不需要返回到形参，所以只要有前两个形参就能达到我们的目的了。第二个问题，将这三个函数的最后一个形参在声明的时候都初始化了一个值，我们在后面调用这些函数时，可以两个参数的调用  ai = GetELem(La, i)，也可以三个参数的调用  ai = GetELem(La, i，e)，这是C第几版的规定我已经忘了，这极大方便了我们函数的编写和灵活的函数调用，你可以网上搜索下相关的资料。

user: user-0
content: 引用 1 楼 user-2的回复:修改如下，供参考：//以下三个函数最后一个形参可以不用，这里偷懒，均设了个初值 //Status GetELem(SqList L, int i, int e=0); //Status PriorElem(SqList L, int cur_e, int pri_e=0); //Status NextElem(SqList L, int cur_e, int Nex_e=0); //file:xc.h  //#ifndef x_h //#define x_h #include<stdio.h> #include<stdlib.h>  #define MAXSIZE 20 //存储空间初始分配量 #define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2  typedef int ElemType; typedef int Status; typedef struct {     ElemType* elem;//数组存储数据元素,最大值为MAXSIZE     int listsize;     int len;//线性表当前长度 }SqList; void CreateList(SqList* L, ElemType a[5], int n);//应该是先声明所构造的线性表操作或者说线性表相关函数 Status InitList(SqList* L); Status DestroyList(SqList* L); Status ClearList(SqList* L); Status ListEmpty(SqList L); Status ListLength(SqList L); Status GetELem(SqList L, int i, int e=0); Status LocateList(SqList L, int e); Status PriorElem(SqList L, int cur_e, int pri_e=0); Status NextElem(SqList L, int cur_e, int Nex_e=0); Status ListInsert(SqList* L, int i, int e); Status ListDelete(SqList* L, int i, int e); Status TravelList(SqList L); //#endif  //file:2.c  //#include "xc.h" //#include"xc.c" void MergeList(SqList La, SqList Lb, SqList* Lc) {     int i, j, k, La_len, Lb_len, ai, bj;     i = j = 0;     k = 0;     La_len = La.len;     Lb_len = Lb.len;     while (i < La_len && j < Lb_len)     {         ai = GetELem(La, i);         bj = GetELem(Lb, j);         if (ai <= bj)         {             ListInsert(Lc, k++, ai);//ListInsert(&Lc, k++, ai);             ++i;         }         else         {             ListInsert(Lc, k++, bj);//ListInsert(&Lc, k++, bj);             ++j;         }     }     while (i < La_len)     {         ai = GetELem(La, i++);         ListInsert(Lc, k++, ai); //ListInsert(&Lc, k++, ai);     }     while (j < Lb_len)     {         bj = GetELem(Lb, j++);         ListInsert(Lc, k++, bj);//ListInsert(&Lc, k++, bj);     } } int main() {     int la[5] = { 1,3,5,7,9 };     int lb[5] = { 2,3,6,8,10 };     int i, m, n, k;     int a = 10;     i = 3;     SqList La, Lb, Lc;     InitList(&La);     InitList(&Lb);     InitList(&Lc);     CreateList(&La, la, 5);     CreateList(&Lb, lb, 5);     printf("下面展现已创立的线性表 La Lb\n\n");     printf("线性表La：\n");     TravelList(La);     printf("\n线性表Lb：\n");     TravelList(Lb);     printf("\n下面合并线性表La和Lb成为Lc:\n");     MergeList(La, Lb, &Lc);     TravelList(Lc);     printf("下面销毁线性表Lc\n销毁后线性表为空\n");     DestroyList(&Lc);     TravelList(Lc);     printf("下面判断线性表是否为空：%d（1为是，0为否）\n", ListEmpty(Lc));     printf("\n下面展现已有线性表La的长度为：%d\n", ListLength(La));     printf("\n有线性表La中第3个元素为：%d\n",GetELem(La, i - 1));     printf("\n下面置空线性表Lb\n则置空后Lb为：\n");     ClearList(&Lb);     TravelList(Lb);     printf("下面判断线性表是否为空：%d（1为是，0为否）\n", ListEmpty(Lb));     printf("\n下面寻找线性表La中第三个元素，以及第三个元素的前驱和后继\n");     m = GetELem(La, i - 1);     n = PriorElem(La, i - 1);     k = NextElem(La, i - 1);     printf("第三个元素为：%d\n第三个元素的前驱为：%d\n第三个元素的后继为：%d\n\n", m, n, k);     printf("下面我们往La表中插入一个元素\n");     printf("假使往第三个位置插入元素a=10\n");     a = 10;     ListInsert(&La, i, a);     printf("插入后线性表La为：\n");     TravelList(La);     printf("\n我们删除线性表La中的第3个元素后得到La为：\n");     ListDelete(&La, i, a);     TravelList(La);     printf("\n下面查找线性表中是否有值为3的元素:\n");     LocateList(La, i);          return 0; }    //file:xc.c  //#include "xc.h" void CreateList(SqList* L, ElemType a[100], int n)//应该是先声明所构造的线性表操作或者说线性表相关函数 {     int i;     for (i = 0; i < n; i++)     {         *(L->elem + i) = a[i];     }     L->len = n; } Status InitList(SqList* L) {     L->elem = (ElemType*)malloc(MAXSIZE * sizeof(ElemType));     if (!L->elem) exit(OVERFLOW);//错误退出     L->len = 0;     L->listsize = MAXSIZE;     return OK; } Status DestroyList(SqList* L) {     free(L->elem);     L->elem = NULL;     L->len = 0;     L->listsize = 0;     return OK; } Status ClearList(SqList* L) {     L->len = 0;     return OK; } Status ListEmpty(SqList L) {     if (L.len == 0)         return TURE;     else         return FALSE; } Status ListLength(SqList L) {     return L.len; }  Status GetELem(SqList L, int i, int e) {     if (i < L.len)     {         e = L.elem[i];         return e;     }     else     {         return FALSE;     } } Status LocateList(SqList L, int e) {     int i;     for (i = 0; i < L.len; i++)     {         if (L.elem[i] == e)         {             printf("值为%d的元素是表中第%d个元素\n", e, i + 1);             return i;         }     } } Status PriorElem(SqList L, int cur_e, int pri_e) {      if (cur_e + 1 == 0)     {         return FALSE;     }     if (cur_e + 1 != 0 && cur_e < L.len)     {         pri_e = L.elem[cur_e - 1];         return  pri_e;     } } Status NextElem(SqList L, int cur_e, int Nex_e) {     if (cur_e == L.len)     {         return FALSE;     }     if (cur_e != L.len && cur_e > 0)     {         Nex_e = L.elem[cur_e + 1];         return Nex_e;     }  } Status ListInsert(SqList* L, int i, int e) {     int* p, * q;     p = L->elem + i;     q = L->elem + L->len;     for (; q >= p-1 ; q--)         *(q + 1) = *q;     * p = e;   //*(--p) = e; //插入元素     L->len++;     return TURE; } Status ListDelete(SqList* L, int i, int e) {     int* p, * q;     if (i<1 || i>L->len)     {         return FALSE;     }     //if (i > 1 && i < L->len)     {         p = L->elem + i - 1;         q = L->elem + L->len - 1;         for (; p <= q; p++)             *p = *(p + 1);         L->len--;         return TURE;     } } Status TravelList(SqList L) {     int i;     int* p = L.elem;     for (i = 0; i < L.len; i++, p++)     {         printf("第%d个元素为：%d\n", i, *p);     }     return TURE; }  //下面展现已创立的线性表 La Lb  //线性表La： //第0个元素为：1 //第1个元素为：3 //第2个元素为：5 //第3个元素为：7 //第4个元素为：9  //线性表Lb： //第0个元素为：2 //第1个元素为：3 //第2个元素为：6 //第3个元素为：8 //第4个元素为：10  //下面合并线性表La和Lb成为Lc: //第0个元素为：1 //第1个元素为：2 //第2个元素为：3 //第3个元素为：3 //第4个元素为：5 //第5个元素为：6 //第6个元素为：7 //第7个元素为：8 //第8个元素为：9 //第9个元素为：10 //下面销毁线性表Lc //销毁后线性表为空 //下面判断线性表是否为空：1（1为是，0为否）  //下面展现已有线性表La的长度为：5  //有线性表La中第3个元素为：5  //下面置空线性表Lb //则置空后Lb为： //下面判断线性表是否为空：1（1为是，0为否）  //下面寻找线性表La中第三个元素，以及第三个元素的前驱和后继 //第三个元素为：5 //第三个元素的前驱为：3 //第三个元素的后继为：7  //下面我们往La表中插入一个元素 //假使往第三个位置插入元素a=10 //插入后线性表La为： //第0个元素为：1 //第1个元素为：3 //第2个元素为：5 //第3个元素为：10 //第4个元素为：7 //第5个元素为：9  //我们删除线性表La中的第3个元素后得到La为： //第0个元素为：1 //第1个元素为：3 //第2个元素为：10 //第3个元素为：7 //第4个元素为：9  //下面查找线性表中是否有值为3的元素: //值为3的元素是表中第2个元素 //请按任意键继续. . . 首先非常感谢你的回答 有两个疑惑，在Getelem函数，PriorELem函数，NextElem函数的调用就应该传递三个参数吧？最后我选择修改为保留三个参数，调用 过程传递三个参数，成功将其运行，但是全部代码看下来 为何要将其修改如此       ai = GetELem(La, i);         bj = GetELem(Lb, j)呢？可否解释一下，非常非常感谢！

user: user-2
content: 修改如下，供参考：//以下三个函数最后一个形参可以不用，这里偷懒，均设了个初值 //Status GetELem(SqList L, int i, int e=0); //Status PriorElem(SqList L, int cur_e, int pri_e=0); //Status NextElem(SqList L, int cur_e, int Nex_e=0); //file:xc.h  //#ifndef x_h //#define x_h #include<stdio.h> #include<stdlib.h>  #define MAXSIZE 20 //存储空间初始分配量 #define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2  typedef int ElemType; typedef int Status; typedef struct {     ElemType* elem;//数组存储数据元素,最大值为MAXSIZE     int listsize;     int len;//线性表当前长度 }SqList; void CreateList(SqList* L, ElemType a[5], int n);//应该是先声明所构造的线性表操作或者说线性表相关函数 Status InitList(SqList* L); Status DestroyList(SqList* L); Status ClearList(SqList* L); Status ListEmpty(SqList L); Status ListLength(SqList L); Status GetELem(SqList L, int i, int e=0); Status LocateList(SqList L, int e); Status PriorElem(SqList L, int cur_e, int pri_e=0); Status NextElem(SqList L, int cur_e, int Nex_e=0); Status ListInsert(SqList* L, int i, int e); Status ListDelete(SqList* L, int i, int e); Status TravelList(SqList L); //#endif  //file:2.c  //#include "xc.h" //#include"xc.c" void MergeList(SqList La, SqList Lb, SqList* Lc) {     int i, j, k, La_len, Lb_len, ai, bj;     i = j = 0;     k = 0;     La_len = La.len;     Lb_len = Lb.len;     while (i < La_len && j < Lb_len)     {         ai = GetELem(La, i);         bj = GetELem(Lb, j);         if (ai <= bj)         {             ListInsert(Lc, k++, ai);//ListInsert(&Lc, k++, ai);             ++i;         }         else         {             ListInsert(Lc, k++, bj);//ListInsert(&Lc, k++, bj);             ++j;         }     }     while (i < La_len)     {         ai = GetELem(La, i++);         ListInsert(Lc, k++, ai); //ListInsert(&Lc, k++, ai);     }     while (j < Lb_len)     {         bj = GetELem(Lb, j++);         ListInsert(Lc, k++, bj);//ListInsert(&Lc, k++, bj);     } } int main() {     int la[5] = { 1,3,5,7,9 };     int lb[5] = { 2,3,6,8,10 };     int i, m, n, k;     int a = 10;     i = 3;     SqList La, Lb, Lc;     InitList(&La);     InitList(&Lb);     InitList(&Lc);     CreateList(&La, la, 5);     CreateList(&Lb, lb, 5);     printf("下面展现已创立的线性表 La Lb\n\n");     printf("线性表La：\n");     TravelList(La);     printf("\n线性表Lb：\n");     TravelList(Lb);     printf("\n下面合并线性表La和Lb成为Lc:\n");     MergeList(La, Lb, &Lc);     TravelList(Lc);     printf("下面销毁线性表Lc\n销毁后线性表为空\n");     DestroyList(&Lc);     TravelList(Lc);     printf("下面判断线性表是否为空：%d（1为是，0为否）\n", ListEmpty(Lc));     printf("\n下面展现已有线性表La的长度为：%d\n", ListLength(La));     printf("\n有线性表La中第3个元素为：%d\n",GetELem(La, i - 1));     printf("\n下面置空线性表Lb\n则置空后Lb为：\n");     ClearList(&Lb);     TravelList(Lb);     printf("下面判断线性表是否为空：%d（1为是，0为否）\n", ListEmpty(Lb));     printf("\n下面寻找线性表La中第三个元素，以及第三个元素的前驱和后继\n");     m = GetELem(La, i - 1);     n = PriorElem(La, i - 1);     k = NextElem(La, i - 1);     printf("第三个元素为：%d\n第三个元素的前驱为：%d\n第三个元素的后继为：%d\n\n", m, n, k);     printf("下面我们往La表中插入一个元素\n");     printf("假使往第三个位置插入元素a=10\n");     a = 10;     ListInsert(&La, i, a);     printf("插入后线性表La为：\n");     TravelList(La);     printf("\n我们删除线性表La中的第3个元素后得到La为：\n");     ListDelete(&La, i, a);     TravelList(La);     printf("\n下面查找线性表中是否有值为3的元素:\n");     LocateList(La, i);          return 0; }    //file:xc.c  //#include "xc.h" void CreateList(SqList* L, ElemType a[100], int n)//应该是先声明所构造的线性表操作或者说线性表相关函数 {     int i;     for (i = 0; i < n; i++)     {         *(L->elem + i) = a[i];     }     L->len = n; } Status InitList(SqList* L) {     L->elem = (ElemType*)malloc(MAXSIZE * sizeof(ElemType));     if (!L->elem) exit(OVERFLOW);//错误退出     L->len = 0;     L->listsize = MAXSIZE;     return OK; } Status DestroyList(SqList* L) {     free(L->elem);     L->elem = NULL;     L->len = 0;     L->listsize = 0;     return OK; } Status ClearList(SqList* L) {     L->len = 0;     return OK; } Status ListEmpty(SqList L) {     if (L.len == 0)         return TURE;     else         return FALSE; } Status ListLength(SqList L) {     return L.len; }  Status GetELem(SqList L, int i, int e) {     if (i < L.len)     {         e = L.elem[i];         return e;     }     else     {         return FALSE;     } } Status LocateList(SqList L, int e) {     int i;     for (i = 0; i < L.len; i++)     {         if (L.elem[i] == e)         {             printf("值为%d的元素是表中第%d个元素\n", e, i + 1);             return i;         }     } } Status PriorElem(SqList L, int cur_e, int pri_e) {      if (cur_e + 1 == 0)     {         return FALSE;     }     if (cur_e + 1 != 0 && cur_e < L.len)     {         pri_e = L.elem[cur_e - 1];         return  pri_e;     } } Status NextElem(SqList L, int cur_e, int Nex_e) {     if (cur_e == L.len)     {         return FALSE;     }     if (cur_e != L.len && cur_e > 0)     {         Nex_e = L.elem[cur_e + 1];         return Nex_e;     }  } Status ListInsert(SqList* L, int i, int e) {     int* p, * q;     p = L->elem + i;     q = L->elem + L->len;     for (; q >= p-1 ; q--)         *(q + 1) = *q;     * p = e;   //*(--p) = e; //插入元素     L->len++;     return TURE; } Status ListDelete(SqList* L, int i, int e) {     int* p, * q;     if (i<1 || i>L->len)     {         return FALSE;     }     //if (i > 1 && i < L->len)     {         p = L->elem + i - 1;         q = L->elem + L->len - 1;         for (; p <= q; p++)             *p = *(p + 1);         L->len--;         return TURE;     } } Status TravelList(SqList L) {     int i;     int* p = L.elem;     for (i = 0; i < L.len; i++, p++)     {         printf("第%d个元素为：%d\n", i, *p);     }     return TURE; }  //下面展现已创立的线性表 La Lb  //线性表La： //第0个元素为：1 //第1个元素为：3 //第2个元素为：5 //第3个元素为：7 //第4个元素为：9  //线性表Lb： //第0个元素为：2 //第1个元素为：3 //第2个元素为：6 //第3个元素为：8 //第4个元素为：10  //下面合并线性表La和Lb成为Lc: //第0个元素为：1 //第1个元素为：2 //第2个元素为：3 //第3个元素为：3 //第4个元素为：5 //第5个元素为：6 //第6个元素为：7 //第7个元素为：8 //第8个元素为：9 //第9个元素为：10 //下面销毁线性表Lc //销毁后线性表为空 //下面判断线性表是否为空：1（1为是，0为否）  //下面展现已有线性表La的长度为：5  //有线性表La中第3个元素为：5  //下面置空线性表Lb //则置空后Lb为： //下面判断线性表是否为空：1（1为是，0为否）  //下面寻找线性表La中第三个元素，以及第三个元素的前驱和后继 //第三个元素为：5 //第三个元素的前驱为：3 //第三个元素的后继为：7  //下面我们往La表中插入一个元素 //假使往第三个位置插入元素a=10 //插入后线性表La为： //第0个元素为：1 //第1个元素为：3 //第2个元素为：5 //第3个元素为：10 //第4个元素为：7 //第5个元素为：9  //我们删除线性表La中的第3个元素后得到La为： //第0个元素为：1 //第1个元素为：3 //第2个元素为：10 //第3个元素为：7 //第4个元素为：9  //下面查找线性表中是否有值为3的元素: //值为3的元素是表中第2个元素 //请按任意键继续. . .