⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bo2-8.cpp

📁 数据结构(严慰民)配套纯C代码 对学习数据结构有很大的帮助
💻 CPP
字号:
 // bo2-8.cpp 顺序表示的线性表(存储结构由c2-1.h定义)的扩展操作(10个)
 #include"bo2-1.cpp"
 void InsertAscend(SqList &L,ElemType e)
 { // 初始条件:按非降序排列的顺序线性表L已存在
   // 操作结果:在L中按非降序插入新的数据元素e,L的长度加1
   ElemType *newbase,*p;
   int k;
   if(L.length>=L.listsize) // 当前存储空间已满,增加分配
   {
     if(!(newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))))
       exit(OVERFLOW); // 存储分配失败
     L.elem=newbase; // 新基址
     L.listsize+=LISTINCREMENT; // 增加存储容量
   }
   p=L.elem;
   for(k=1;k<=L.length;k++)
     if(e>*p)
       p++;
     else
       break;
   ListInsert(L,k,e); // 函数在bo2-1.cpp中
 }

 void InsertDescend(SqList &L,ElemType e)
 { // 初始条件:按非升序排列的顺序线性表L已存在
   // 操作结果:在L中按非升序插入新的数据元素e,L的长度加1
   ElemType *newbase,*p;
   int k;
   if(L.length>=L.listsize) // 当前存储空间已满,增加分配
   {
     if(!(newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))))
       exit(OVERFLOW); // 存储分配失败
     L.elem=newbase; // 新基址
     L.listsize+=LISTINCREMENT; // 增加存储容量
   }
   p=L.elem;
   for(k=1;k<=L.length;k++)
     if(e<*p)
       p++;
     else
       break;
   ListInsert(L,k,e); // 函数在bo2-1.cpp中
 }

 Status HeadInsert(SqList &L,ElemType e)
 { // 初始条件:顺序线性表L已存在。操作结果:在L的头部插入新的数据元素e,L的长度加1
   ElemType *p,*q,*newbase;
   if(L.length>=L.listsize)
   {
     if(!(newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))))
       exit(OVERFLOW);
     L.elem=newbase;
     L.listsize+=LISTINCREMENT;
   }
   q=L.elem;
   for(p=L.elem+L.length-1;p>=q;--p)
     *(p+1)=*p;
   *q=e;
   L.length++;
   return OK;
 }

 Status EndInsert(SqList &L,ElemType e)
 { // 初始条件:顺序线性表L已存在。操作结果:在L的尾部插入新的数据元素e,L的长度加1。
   ElemType *q,*newbase;
   if(L.length>=L.listsize) // 当前存储空间已满,增加分配
   {
     if(!(newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))))
       exit(OVERFLOW); // 存储分配失败
     L.elem=newbase; // 新基址
     L.listsize+=LISTINCREMENT; // 增加存储容量
   }
   q=L.elem+L.length; // q为插入位置
   *q=e;
   L.length++;
   return OK;
 }

 Status DeleteFirst(SqList &L,ElemType &e)
 { // 初始条件:顺序线性表L已存在,且有不少于1个元素
   // 操作结果:删除L的第一个数据元素,并由e返回其值,L的长度减1
   ElemType *p,*q;
   if(ListEmpty(L)) // 空表无法删除
     return ERROR;
   p=L.elem; // p指向第一个元素
   e=*p;
   q=L.elem+L.length-1; // q指向最后一个元素
   for(++p;p<=q;++p)
     *(p-1)=*p; // 从第2个元素起,所有元素向前移动一个位置
   L.length--; // 当前长度减1
   return OK;
 }

 Status DeleteTail(SqList &L,ElemType &e)
 { // 初始条件:顺序线性表L已存在,且有不少于1个元素
   // 操作结果:删除L的最后一个数据元素,并用e返回其值,L的长度减1
   ElemType *p;
   if(!L.length) // 空表
     return ERROR;
   p=L.elem+L.length-1; // 最后一个数据元素的位置
   e=*p; // 被删除元素的值赋给e
   L.length--; // 表长减1
   return OK;
 }

 Status DeleteElem(SqList &L,ElemType e)
 { // 删除表中值为e的元素,并返回TRUE;如无此元素,则返回FALSE
   int i=0,j;
   while(i<L.length&&e!=*(L.elem+i))
     i++;
   if(i==L.length) // 没找到
     return FALSE;
   else
   {
     for(j=i;j<L.length;j++)
       *(L.elem+j)=*(L.elem+j+1); // 后面的元素依次前移
     L.length--; // 当前长度减1
     return TRUE;
   }
 }

 Status ReplaceElem(SqList L,int i,ElemType e)
 { // 用e取代表L中第i个元素的值
   if(i<1||i>L.length) // i值不合法
     exit(ERROR);
   *(L.elem+i-1)=e;
   return OK;
 }

 Status CreatAscend(SqList &L,int n)
 { // 按非降序建立n个元素的线性表
   int i,j;
   ElemType e;
   InitList(L);
   printf("请输入%d个元素:\n",n);
   cin>>e;
   ListInsert(L,1,e); // 在空表中插入第1个元素
   for(i=1;i<n;i++)
   {
     cin>>e;
     for(j=0;j<L.length;j++)
       if(e<=*(L.elem+j))
         break;
     ListInsert(L,j+1,e); // 插于表中
   }
   return TRUE;
 }

 Status CreatDescend(SqList &L,int n)
 { // 按非升序建立n个元素的线性表
   int i,j;
   ElemType e;
   InitList(L);
   printf("请输入%d个元素:\n",n);
   cin>>e;
   ListInsert(L,1,e); // 在空表中插入第1个元素
   for(i=1;i<n;i++)
   {
     cin>>e;
     for(j=0;j<L.length;j++)
       if(e>=*(L.elem+j))
         break;
     ListInsert(L,j+1,e); // 插于表中
   }
   return TRUE;
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -