zoukankan      html  css  js  c++  java
  • 顺序表的顺序表示和实现

    一.线性表的顺序表示的概念:用一组地址连续的存储单元依次存储线性表的数据元素。

    1.线性表中的第i+1个元素的存储位置LOC(a[i+1]) 与第i个元素的存储位置LOC(a[i])之间的关系为:

    LOC(a[i+1]) = LOC(a[i])+n;

    n表示每个元素元素占用n个存储单元。

    二.线性表的基本操作

    1.线性表的动态分配顺序存储结构

    #include<stdio.h>
    #include<stdlib.h>
    
    #define LIST_SIZE 20    //初始容量20
    #define INCREAMENT 10//每次扩容10
    #define ERROR 0
    #define OK 1
    typedef int elemType;
    typedef int Status;
    

      

    typedef struct{
    	elemType *elems; //存储空间基址 
    	int length;		//当前元素个数 
    	int listsize;	//总容量 
    }SqList;
    

    2.初始化线性表

    //构造一个空的顺序表 
    Status initList(SqList &L){
    	L.elems = (elemType *)malloc(LIST_SIZE*sizeof(elemType));
    	if(!L.elems)
    		return ERROR;//存储分配失败 
    	L.length=0;    //长度为0
    	L.listsize=LIST_SIZE;//容量为初始容量
    	return OK;
    }    
    

    3.插入元素

    需将插入位置之后的元素依次后移一个位置。

    //在index位置插入元素e 
    Status insert(SqList &L,int index,int e){
    	if(index<1||index>L.length+1)
    		return ERROR;//插入位置不合法 
    	if(L.length==L.listsize){
    		elemType *newbase = (elemType*)realloc(L.elems,(L.listsize+INCREAMENT)*sizeof(elemType));
    		if(!newbase)
    			return ERROR;
    		L.elems=newbase;
    		L.listsize = L.listsize+INCREAMENT;
    	}
    	elemType* loc = &(L.elems[index-1]);	//要插入的位置 
    	
    	for(int i=L.length-1;i>=index-1;i--){
    		L.elems[i+1]=L.elems[i];
    	}
    	/*
    		与上面效果相同 
    	for(int *p=&(L.elems[L.length-1]);p>=loc;p--){
    		*(p+1)=*p;		
    	}*/
    	
    	*loc = e;
    	L.length++;
    	return OK;
    }
    
    //在末尾插入元素e 
    Status add(SqList &L,elemType e){
    	return insert(L,L.length+1,e);
    }
    

    4.删除元素

    需将删除位置之后的元素依次向前移动一个位置。

    //删除index位置的值并返回 
    elemType del(SqList &L,int index){
    	if(index<1||index>L.length)
    		return NULL;	//删除位置不合法
    	elemType *p = &(L.elems[index-1]);
    	elemType e = *p;
    	for(p;p<=&(L.elems[L.length-1]);p++)
    		*p=*(p+1);
    	L.length--;
    	return e;
    }
    

    5.查找、打印

    //寻找元素e的位置 
    int locate(SqList &L,elemType e){
    	for(int i=0;i<L.length;i++){
    		if(L.elems[i]==e)
    			return i+1; //返回索引值+1 
    	}
    	return 0;//未找到 
    }
    //打印顺序表 
    void print(SqList &L){
    	for(int i=0;i<L.length;i++)
    		printf("%d ",L.elems[i]);
    	printf("
    ");
    	
    }
    

    6.其他

    //将两个有序顺序表合并为一个有序的顺序表 
    void merge(SqList A,SqList B,SqList &C){
    	int a=0,b=0,k=0;
    	int len = A.length+B.length;
    	if(len>C.listsize){
    		elemType *newbase = (elemType *)realloc(C.elems,len*sizeof(elemType));
    		C.elems=newbase; 
    		C.listsize=len;
    	}
    	C.length=len;
    	while(a<A.length&&b<B.length){
    		if(A.elems[a]<=B.elems[b]){
    			C.elems[k++]=A.elems[a++];
    		}else{
    			C.elems[k++]=B.elems[b++];
    		}
    	}
    	while(a<A.length)
    		C.elems[k++]=A.elems[a++];
    	while(b<B.length)
    		C.elems[k++]=B.elems[b++];
    }
    

      

  • 相关阅读:
    170120、java 如何在pdf中生成表格
    170119、100亿数据1万属性数据架构设计
    170118、快速失败Vs安全失败(Java迭代器附示例)
    170117、spring解决乱码
    170116、centos6.4下nginx和ftp搭建图片服务器
    170113、CentOs6.4中安装和配置vsftp简明教程
    linux nginx完全卸载
    DevOps 的技术栈与工具链
    git与pycharm结合使用
    JMeter和JMeterPlugin的下载安装
  • 原文地址:https://www.cnblogs.com/hekuiFlye/p/9167710.html
Copyright © 2011-2022 走看看