您的位置:首页 > 其它

线性表学习

2016-01-26 20:27 246 查看
线性表是最常用也是最简单的一种数据结构,一个线性表是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);所以线性表一般用来存储增删不太频繁的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: