C++线性表通过结构体实现操作和结构体字符串快速排序和shell排序结合

#include<iostream>
#include<string>
#define ml 10
using namespace std;
typedef struct{//定义Data数据项
 std::string name;
 long num;
}Data;
struct Link{//定义结构体
 Data data[ml+1];
 int length;
}L;
void initLink(Link *p){//初始化,即便有数据可以覆盖写入增加效率
 p->length=0;
}
int lengthlink(Link *p){//返回节点数
 return p->length;
}
int insertlink(Link *p ,int n,Data data){//指定位置插入
 if(n<0||n>ml-1){
  return 0;
 }
 for(int i=p->length+1;i>=n;i--){
  p->data[i+1]=p->data[i];
 }
 p->data[n]=data;
 p->length++;
 return 1;
}
int lastinsertlink(Link *p,Data data){///不指定位置插入使用
 if(p->length>=ml){
  return 0;
 }
 p->data[++p->length]=data;
 return 1;
}
int deletelink(Link *p,int n){
 if(n<0||n>p->length){
  return 0;
 }
 for(int i=n;i<=p->length;i++){
  p->data[i]=p->data[i+1];
 }
 p->length--;
 return 1;
}
void sortstring(Link *p,int left,int right){
 int l=left;
 int r=right;

 Data f=p->data[(l+r)/2];
 while(l<r){
  while(strcmp(p->data[l].name.c_str(),f.name.c_str())<0 && l<right){
   l++;
  }
  while(strcmp(p->data[r].name.c_str(),f.name.c_str())>0 && r>left){
   --r;
  }

  if(l<=r){
   Data temp;
   temp=p->data[l];
   p->data[l]=p->data[r];
   p->data[r]=temp;
   l++;
   --r;
  }
 }
 if(l==r){
  l++;
 }
 if(left<r){
  sortstring(p,left,l-1);
 }
 if(l<right){
  sortstring(p,r+1,right);
 }
}
void viewLink(Link *p){
 for(int i=1;i<=p->length;i++){//输出从1开始,避免输出0位置的地址项
  cout<<"数据项:第"<<i<<"位置是  "<<p->data[i].name<<" "<<p->data[i].num<<endl;
 }
 cout<<"节点长度为: "<<p->length<<endl;
}
void main(){
 Data data[3]={{"a",10001},{"b",10002},{"c",10003}};
 Link list;
 initLink(&list);
 for(int i=0;i<3;i++){
  lastinsertlink(&list,data[i]);//测试追加节点方法插入节点,优点是效率。
 }
 viewLink(&list);
 Data data1={"d",50001};
 insertlink(&list,2,data1);///测试指定位置插入节点
 viewLink(&list);
 Data data2[2]={{"e",90001},{"f",80001}};///测试插入多个节点
 for(int j=0;j<2;j++){
  int t=2;
  insertlink(&list,t,data2[j]);
  t++;
 }
 viewLink(&list);
 sortstring(&list,1,6);///测试字符串排序
 viewLink(&list);
 deletelink(&list,4);//测试删除指定节点
 viewLink(&list);
}

测试通过结构体实现线性表的操作,同时也实现对字符串的排序, 快速排序和shell排序的结合,有效提高排序效率,注意排序时两个哨兵的位置。

原文地址:https://www.cnblogs.com/xiaozhihu/p/10816946.html

时间: 2024-08-10 11:56:59

C++线性表通过结构体实现操作和结构体字符串快速排序和shell排序结合的相关文章

动态分配的顺序线性表的十五种操作—C语言实现

线性表 定义:是最常用的,也是最简单的数据结构,是长度为n个数据元素的有序的序列. 含有大量记录的线性表叫文件 记录:稍微复杂的线性表里,数据元素为若干个数据项组成,这时把一个数据元素叫记录 结构特点:在非空有限的条件下,存在唯一的一个表头结点,唯一的一个表尾结点,除去第一个元素之外,每个数据元素都只有一个前驱,除去最后一个元素之外,每一个数据元素都只有一个后继. 注意:线性表中的数据元素可以是各种各样的,但同一线性表中的元素必定具有相同特性(属于同一数据对象,类似数组).线性表的数据元素间有序

c数据结构 -- 线性表之 复杂的链式存储结构

复杂的链式存储结构 循环链表 定义:是一种头尾相接的链表(即表中最后一个结点的指针域指向头结点,整个链表形成一个环) 优点:从表中任一节点出发均可找到表中其他结点 注意:涉及遍历操作时,终止条件是判断 p->next == L? 双向链表 定义:在单链表的每个结点离再增加一个指向直接前驱的指针域 prior,这样链表中就形成了有 两个方向不用的链,故称为双向链表 双向循环链表 定义: 和单链的循环表类似,双向链表也可以有循环表 ·让头节点的前驱指针指向链表的最后一个结点 ·让最后一个结点的后继指

(一)线性表结构1数组实现

(一)数组实现线性表 1.定义集合(结构体实现) 1 #define MAX 10 2 typedef struct { 3 int DATA[MAX]; 4 int last; 5 }LIST; DATA数组用于存放整型数据,last表示最后元素的下标 2.定义各类操作 a.创建空表 LIST *MakeEmpty() { LIST *PtrL; PtrL = (LIST *)malloc(sizeof(LIST)); PtrL->last = -1; return PtrL; } b.插入数

02.线性表(一)顺序存储结构

顺序存储结构 一.线性表基本概念 1.线性表定义 线性表(list)是指零个或多个数据元素的有限序列,所有数据元素为相同数据类型且一个数据元素可以由多个数据项组成.若将线性表记为(a1,..ai-1,ai,ai+1...,an),线性表元素的个数n(n>0,n=0时为空表)定义为线性表的长度,其中ai-1是ai 的直接前驱元素,ai+1是ai的直接后继元素. 2.线性表的抽象数据类型 ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,....an},每个元素的类型均匀Da

数据结构(严蔚敏、吴伟民)——读书笔记-2、 线性表及其基本运算、顺序存储结构

第二章   线性表 2.1    线性表及其基本运算 2.2    线性表的顺序存储结构 2.3    线性表的链式存储结构 1.线性表:是n个数据元素的有限序列. 直接前驱元素.直接后继元素,n = 0时,称为空表. 一个数据元素可以有若干个数据项组成.在这种情况下,常把数据元素称为记录,含有大量记录的线性表又称为文件. 2.基本运算 InitList(&L)        初始化操作 设定一个空的线性表L ListLength(L)求长度函数 函数值为线性表L中数据元素的个数 GetElem

04.线性表(三)链式存储结构.单链表2

链式存储结构.单链表2 顺序存储结构的创建实质是一个数组的初始化,存储空间连续且其大小和类型已经固定:单链表存储空间不连续,是一种动态结构且它所占用空间的大小和位置是不需要预先分配划定的,可以根据系统的情况和实际的需求即时生成. 一.单链表的整表创建 创建单链表的过程就是一个动态生成链表的过程,即从"空表"的初始化起,依次建立各元素结点,并逐个插入链表. 1.算法思路 (1)声明一个结点p和计数器变量i; (2)初始化一空链表L (3)让链表L的头结点的指针指向NULL,即建立一个带头

线性表的顺序存储结构元素的获取,插入及删除

对于线性表,我们可以对其元素进行简单的获取,插入以及删除操作. 先来讲讲元素的获取操作,完整来讲,就是对,将线性表L第i个位置的元素返回,若成功,则返回1,且将第i个位置的元素的值赋给*e:若失败,则返回0.代码如下: int GetElem ( SqList L, int i, int *e ){          if ( i < 1 || i > L->length || L->length == 0 )         return 0;              *e =

[大话数据结构]线性表之单链表结构和顺序存储结构

线性表定义: 零个或者多个数据元素的有限序列.元素之间是有顺序的,如果元素存在多个,则第一个元素无前驱,最后一个元素无后继.其他每个元素都有且只有一个前驱和后继.并且数据元素的类型要相同. 线性表的抽象数据类型: ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType. 其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素. 数据元素之间的关系是一对一的关系.

线性表的顺序存储结构和实现

头文件 head.h #include<string.h> #include<ctype.h> #include<malloc.h> /* malloc()等 */ #include<limits.h> /* INT_MAX等 */ #include<stdio.h> /* EOF(=^Z或F6),NULL */ #include<stdlib.h> /* atoi() */ #include<io.h> /* eof()