bo2-1.cpp 顺序表示的线性表(存储结构由c2-1.h定义)的基本操作(12个)

  1.  // bo2-1.cpp 顺序表示的线性表(存储结构由c2-1.h定义)的基本操作(12个),包括算法2.3,2.4,2.5,2.6
  2.  void InitList(SqList &L) // 算法2.3
  3.  { // 操作结果:构造一个空的顺序线性表L
  4.    L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
  5.    if(!L.elem)
  6.      exit(OVERFLOW); // 存储分配失败
  7.    L.length=0; // 空表长度为0
  8.    L.listsize=LIST_INIT_SIZE; // 初始存储容量
  9.  }
  10.  void DestroyList(SqList &L)
  11.  { // 初始条件:顺序线性表L已存在。操作结果:销毁顺序线性表L
  12.    free(L.elem);
  13.    L.elem=NULL;
  14.    L.length=0;
  15.    L.listsize=0;
  16.  }
  17.  void ClearList(SqList &L)
  18.  { // 初始条件:顺序线性表L已存在。操作结果:将L重置为空表
  19.    L.length=0;
  20.  }
  21.  Status ListEmpty(SqList L)
  22.  { // 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE
  23.    if(L.length==0)
  24.      return TRUE;
  25.    else
  26.      return FALSE;
  27.  }
  28.  int ListLength(SqList L)
  29.  { // 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数
  30.    return L.length;
  31.  }
  32.  Status GetElem(SqList L,int i,ElemType &e)
  33.  { // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)。操作结果:用e返回L中第i个数据元素的值
  34.    if(i<1||i>L.length)
  35.      return ERROR;
  36.    e=*(L.elem+i-1);
  37.    return OK;
  38.  }
  39.  int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
  40.  { // 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
  41.    // 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
  42.    //           若这样的数据元素不存在,则返回值为0。算法2.6
  43.    ElemType *p;
  44.    int i=1; // i的初值为第1个元素的位序
  45.    p=L.elem; // p的初值为第1个元素的存储位置
  46.    while(i<=L.length&&!compare(*p++,e))
  47.      ++i;
  48.    if(i<=L.length)
  49.      return i;
  50.    else
  51.      return 0;
  52.  }
  53.  Status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e)
  54.  { // 初始条件:顺序线性表L已存在
  55.    // 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,
  56.    //           否则操作失败,pre_e无定义
  57.    int i=2;
  58.    ElemType *p=L.elem+1;
  59.    while(i<=L.length&&*p!=cur_e)
  60.    {
  61.      p++;
  62.      i++;
  63.    }
  64.    if(i>L.length)
  65.      return INFEASIBLE; // 操作失败
  66.    else
  67.    {
  68.      pre_e=*--p;
  69.      return OK;
  70.    }
  71.  }
  72.  Status NextElem(SqList L,ElemType cur_e,ElemType &next_e)
  73.  { // 初始条件:顺序线性表L已存在
  74.    // 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,
  75.    //           否则操作失败,next_e无定义
  76.    int i=1;
  77.    ElemType *p=L.elem;
  78.    while(i<L.length&&*p!=cur_e)
  79.    {
  80.      i++;
  81.      p++;
  82.    }
  83.    if(i==L.length)
  84.      return INFEASIBLE; // 操作失败
  85.    else
  86.    {
  87.      next_e=*++p;
  88.      return OK;
  89.    }
  90.  }
  91.  Status ListInsert(SqList &L,int i,ElemType e) // 算法2.4
  92.  { // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1
  93.    // 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
  94.    ElemType *newbase,*q,*p;
  95.    if(i<1||i>L.length+1) // i值不合法
  96.      return ERROR;
  97.    if(L.length>=L.listsize) // 当前存储空间已满,增加分配
  98.    {
  99.      if(!(newbase=(ElemType *)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(ElemType))))
  100.        exit(OVERFLOW); // 存储分配失败
  101.      L.elem=newbase; // 新基址
  102.      L.listsize+=LIST_INCREMENT; // 增加存储容量
  103.    }
  104.    q=L.elem+i-1; // q为插入位置
  105.    for(p=L.elem+L.length-1;p>=q;--p) // 插入位置及之后的元素右移
  106.      *(p+1)=*p;
  107.    *q=e; // 插入e
  108.    ++L.length; // 表长增1
  109.    return OK;
  110.  }
  111.  Status ListDelete(SqList &L,int i,ElemType &e) // 算法2.5
  112.  { // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)
  113.    // 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1
  114.    ElemType *p,*q;
  115.    if(i<1||i>L.length) // i值不合法
  116.      return ERROR;
  117.    p=L.elem+i-1; // p为被删除元素的位置
  118.    e=*p; // 被删除元素的值赋给e
  119.    q=L.elem+L.length-1; // 表尾元素的位置
  120.    for(++p;p<=q;++p) // 被删除元素之后的元素左移
  121.      *(p-1)=*p;
  122.    L.length--; // 表长减1
  123.    return OK;
  124.  }
  125.  void ListTraverse(SqList L,void(*vi)(ElemType&))
  126.  { // 初始条件:顺序线性表L已存在
  127.    // 操作结果:依次对L的每个数据元素调用函数vi()
  128.    //           vi()的形参加'&',表明可通过调用vi()改变元素的值
  129.    ElemType *p;
  130.    int i;
  131.    p=L.elem;
  132.    for(i=1;i<=L.length;i++)
  133.      vi(*p++);
  134.    printf("/n");
  135.  }
以下是代码实现: c1.h: ```c typedef struct LNode { Complex data; struct LNode *next; } LNode, *LinkList; ``` c2-2.h: ```c void CreateList(LinkList *L, int n); void SortList(LinkList L); void PrintList(LinkList L); ``` bo2-2.c: ```c #include <stdio.h> #include <stdlib.h> #include "c1.h" #include "c2-2.h" void CreateList(LinkList *L, int n) { *L = (LinkList) malloc(sizeof(LNode)); (*L)->next = NULL; LinkList p = *L; for (int i = 0; i < n; i++) { LinkList q = (LinkList) malloc(sizeof(LNode)); scanf("%lf%lf", &q->data.real, &q->data.imag); q->next = NULL; p->next = q; p = q; } } void SortList(LinkList L) { int len = 0; for (LinkList p = L->next; p != NULL; p = p->next) { len++; } for (int i = 0; i < len - 1; i++) { LinkList p = L->next; for (int j = 0; j < len - i - 1; j++) { if (p->data.real * p->data.real + p->data.imag * p->data.imag > p->next->data.real * p->next->data.real + p->next->data.imag * p->next->data.imag) { Complex tmp = p->data; p->data = p->next->data; p->next->data = tmp; } p = p->next; } } } void PrintList(LinkList L) { for (LinkList p = L->next; p != NULL; p = p->next) { printf("%.2lf+%.2lfi ", p->data.real, p->data.imag); } printf("\n"); } ``` main2-2.c: ```c #include <stdio.h> #include "c1.h" #include "c2-2.h" int main() { LinkList L; int n; scanf("%d", &n); CreateList(&L, n); SortList(L); PrintList(L); return 0; } ``` 输入格式为: ``` n a1 b1 a2 b2 ... an bn ``` 其中 n 表示复数个数,ai 和 bi 分别表示第 i 个复数的实部和虚部。 输出格式为: 按模从小到大排列后的复数列表,每个复数的实部和虚部之间用加号连接,复数之间用空格分隔。 例如,输入: ``` 3 1 2 3 4 5 6 ``` 输出: ``` 1.00+2.00i 3.00+4.00i 5.00+6.00i ``` 注意,这里的输出结果是按照模从小到大排列的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值