线性表学习
2016-01-26 20:27
246 查看
线性表是最常用也是最简单的一种数据结构,一个线性表是n个数据元素的有限序列。
线性表的基本结构:
其中int *data也可以换成是一个数组,如int data[maxsize];maxsize你自己定咯,我这里用指针,然后初始化的时候申请动态空间。
上面是基本结构,然后要初始化咯,就是给他赋初值啦。代码如下:
插入元素:
删除元素:
有以上代码基本就可以生成一个线性表了,数据你自己输入,后面的代码有输入方式。比较完整的代码:
View Code
线性表特点:易查询,难增删;要查询一个线性表中某一个元素的值很简单,只要根据索引位置来查询就行,所以时间复杂度是O(1);但是如果要增加或者删除元素,最好的情况时间复杂度是O(1),最坏的情况是O(n);所以平均下来时间复杂度是O(n/2),再简化点就是O(n);所以线性表一般用来存储增删不太频繁的数据。
线性表的基本结构:
typedef struct xianxing{ int length; int *data; }L;
其中int *data也可以换成是一个数组,如int data[maxsize];maxsize你自己定咯,我这里用指针,然后初始化的时候申请动态空间。
上面是基本结构,然后要初始化咯,就是给他赋初值啦。代码如下:
int InitList(xianxing &L){//初始化相性表L L.length=0; L.data=(int *)malloc(ElemNum*sizeof(int));//申请空间,线性表最大容量:ElemNum个正数 if(!L.data)exit(0); return 1; }
插入元素:
int InsertList(xianxing &L,int i,int e){//将数值e插入线性表L第i个位置 if(i<1||i>L.length+1)return 0; int *k,*m; m=(L.data+i-1); for(k=(L.data+L.length-1);k>=m;--k){ *(k+1)=*k; } *m=e; ++L.length; return 1; }
删除元素:
int ListDelete(xianxing &L,int i,int &e){//删除L中第i的位置的数值,并将这个值赋值给e if(i<1||i>L.length)return 0; e=L.data[i-1]; int *p; for(p=L.data+i-1;p<L.data+L.length-1;p++){ *p=*(p+1); } --L.length; return 1; }
有以上代码基本就可以生成一个线性表了,数据你自己输入,后面的代码有输入方式。比较完整的代码:
#include<stdio.h> #include<stdlib.h> #include<ctype.h> #define ElemNum 100 typedef struct xianxing{ int length; int *data; }L; int InitList(xianxing &L){//初始化相性表L L.length=0; L.data=(int *)malloc(ElemNum*sizeof(int));//申请空间,线性表最大容量:ElemNum个正数 if(!L.data)exit(0); return 1; } int InsertList(xianxing &L,int i,int e){//将数值e插入线性表L第i个位置 if(i<1||i>L.length+1)return 0; int *k,*m; m=(L.data+i-1); for(k=(L.data+L.length-1);k>=m;--k){ *(k+1)=*k; } *m=e; ++L.length; return 1; } int ListDelete(xianxing &L,int i,int &e){//删除L中第i的位置的数值,并将这个值赋值给e if(i<1||i>L.length)return 0; e=L.data[i-1]; int *p; for(p=L.data+i-1;p<L.data+L.length-1;p++){ *p=*(p+1); } /*for(p=&(L.data[i-1]);p<&(L.data[L.length-1]);p++){ *p=*(p+1); }//跟上面的写法是一样的*/ --L.length; return 1; } int LocateElem(xianxing L,int e,int &l){//查找L中数e第一次出现的位置并赋值给l int *p; l=-1;//l=-1表示没找到,外部要判断 for(p=L.data;p<=L.data+L.length-1;p++){ if(*p==e){ l=p-L.data; break; } } } int shuru(xianxing &L){//对已经初始化了的线性表输入一串数 int i=0,t=0; while(i<ElemNum){ scanf("%d",&t);//输入数值 if(t==-1)break;//输入-1表示输入结束 InsertList(L,i+1,t);//插入数值 i++; } } int MergeList(xianxing &La,xianxing &Lb,xianxing &Lc){//合并两个线性表 int *pa,*pb,*pc; int *pa_last,*pb_last; pa=La.data; pb=Lb.data; pa_last=La.data+La.length-1; pb_last=Lb.data+Lb.length-1; Lc.length=La.length+Lb.length; pc=Lc.data=(int *)malloc(Lc.length*sizeof(int)); if(!Lc.data)return 0; while(pa<=pa_last)*pc++=*pa++; while(pb<=pb_last)*pc++=*pb++; } int fuzhi(xianxing La,xianxing &Lb){//复制两个线性表 int *p,*q; p=La.data; q=Lb.data; for(p;p<=La.data+La.length-1;p++){ *q++=*p; } Lb.length=La.length; } int clearList(xianxing &L){ L.data=(int *)malloc(ElemNum*sizeof(int)); L.length=0; } int getElem(xianxing L,int i,int &e){ if(i<1||i>L.length)return 0; int *p; e=*(L.data+i-1); return 1; } int destroyList(xianxing &L){ int *p,*q; p=L.data; delete [] p; L.data=NULL; } int main(){ /*****************定义一个线性表并输入一串数字,然后存入data.txt文件中*********************/ /* xianxing L;//定义相性表L InitList(L);//初始化线性表 shuru(L); printf("\n\n"); int *p; FILE *fp; fp=fopen("data.txt","w"); for(p=(L.data);p<=L.data+L.length-1;++p){ fprintf(fp,"%d ",*p); } fclose(fp); */ /**************删除你想要删除的第几位数*****************/ /*int m,l=0; printf("输入你想删除的第几位数:"); scanf("%d",&l); ListDelete(L,l,m); fprintf(fp,"\n\n"); for(p=(L.data);p<=L.data+L.length-1;++p){ fprintf(fp,"%d ",*p); } printf("删除了第%d位数%d",l,m);*/ /***********************查找想要的数的第一次出现的位置*************************/ /* int chazhaoshu=0; printf("输入你想查找的数:"); while(scanf("%d",&chazhaoshu)!=EOF){//isalnum判断是不是数字 if(isalpha(chazhaoshu)!=0){ return 0; } int q; LocateElem(L,chazhaoshu,q); if(q==-1){ printf("抱歉没查到那个数的位置\n"); }else{ printf("你想要查找的数出现的第一次位置是在%d\n",q); } printf("输入你想查找的数:"); } */ /*************合并两个线性表****************/ /* xianxing La,Lb,Lc; InitList(La); InitList(Lb); InitList(Lc); shuru(La); printf("\n\n"); shuru(Lb); MergeList(La,Lb,Lc); int *lc; for(lc=Lc.data;lc<=Lc.data+Lc.length-1;lc++){//输出合并后的线性表 printf("%d\n",*(lc)); } */ /********************复制线性表*************************/ /* xianxing La,Lb; InitList(La); InitList(Lb); shuru(La); fuzhi(La,Lb);//执行复制 int *p; for(p=Lb.data;p<=Lb.data+Lb.length-1;p++){//输出复制后的线性表 printf("%d\n",*p); } */ /*******************清空线性表**********************/ /* xianxing L; InitList(L); shuru(L); printf("%d %d",*(L.data+1),L.length); printf("\n\n"); clearList(L);//清空 printf("%d %d",*(L.data+1),L.length); */ /*******************根据序号查找元素值***********************/ /* xianxing L; InitList(L); shuru(L); int m=0; printf("输入你想要查找第几个元素的值"); scanf("%d",&m); int e; if(getElem(L,m,e)){ printf("你想要查找的数的值是%d",e); }else{ printf("没找到"); } */ /**********************销毁线性表******************************/ xianxing L; InitList(L); shuru(L); printf("%d",*(L.data+1)); destroyList(L); //printf("%d",*(L.data+1));去掉注释则运行报错,因为已经销毁了L.data return 0; }
View Code
线性表特点:易查询,难增删;要查询一个线性表中某一个元素的值很简单,只要根据索引位置来查询就行,所以时间复杂度是O(1);但是如果要增加或者删除元素,最好的情况时间复杂度是O(1),最坏的情况是O(n);所以平均下来时间复杂度是O(n/2),再简化点就是O(n);所以线性表一般用来存储增删不太频繁的数据。
相关文章推荐
- 《Web前端开发修炼之道》笔记三:高质量CSS(二)
- AfxBeginThread创建用户界面线程
- 转发一个学生的实习感悟
- 黑马程序员-反射
- hdu 5171 GTY's birthday gift【矩阵快速幂】【思维】【感受矩阵和数论的神奇】
- 图像视觉领域新文章及相应开源代码
- spring整合redis客户端及缓存接口设计(转)
- iOS 根据字符串数目,自定义Label等控件的高度
- 93. Spiral Matrix
- 大型网站架构系列:消息队列(二) (转)
- Hortonworks HDP Sandbox定制(配置)开机启动服务(组件)
- ubuntu server 无线网卡的处理
- leetcode166. Fraction to Recurring Decimal
- Good Bye 2015 D. New Year and Ancient Prophecy
- Calling 64-bit assembly language functions lodged inside the Delphi source code
- 大型网站架构系列:分布式消息队列(一) (转)
- Android平台下hook框架adbi的研究(下)
- Parcelable用法。
- eclipse代码自动补全
- MS WORD 通配符查找 正则表达式