码迷,mamicode.com
首页 > 其他好文 > 详细

线性表学习

时间:2016-01-26 21:52:40      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

线性表是最常用也是最简单的一种数据结构,一个线性表是n个数据元素的有限序列。

线性表的基本结构:

1 typedef struct xianxing{
2         int length;
3         int *data;
4     }L;

其中int *data也可以换成是一个数组,如int data[maxsize];maxsize你自己定咯,我这里用指针,然后初始化的时候申请动态空间。

上面是基本结构,然后要初始化咯,就是给他赋初值啦。代码如下:

1 int InitList(xianxing &L){//初始化相性表L
2     L.length=0;
3     L.data=(int *)malloc(ElemNum*sizeof(int));//申请空间,线性表最大容量:ElemNum个正数
4     if(!L.data)exit(0);
5     return 1;
6 }

插入元素:

 1 int InsertList(xianxing &L,int i,int e){//将数值e插入线性表L第i个位置
 2     if(i<1||i>L.length+1)return 0;
 3     int *k,*m;
 4     m=(L.data+i-1);
 5     for(k=(L.data+L.length-1);k>=m;--k){
 6         *(k+1)=*k;
 7     }
 8     *m=e;
 9     ++L.length;
10     return 1;
11 }

删除元素:

 1 int ListDelete(xianxing &L,int i,int &e){//删除L中第i的位置的数值,并将这个值赋值给e
 2     if(i<1||i>L.length)return 0;
 3     e=L.data[i-1];
 4     int *p;
 5     for(p=L.data+i-1;p<L.data+L.length-1;p++){
 6         *p=*(p+1);
 7     }
 8     --L.length;
 9     return 1;
10 }

有以上代码基本就可以生成一个线性表了,数据你自己输入,后面的代码有输入方式。比较完整的代码:

技术分享
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<ctype.h>
  4 #define ElemNum 100
  5 typedef struct xianxing{
  6         int length;
  7         int *data;
  8     }L;
  9 int InitList(xianxing &L){//初始化相性表L
 10     L.length=0;
 11     L.data=(int *)malloc(ElemNum*sizeof(int));//申请空间,线性表最大容量:ElemNum个正数
 12     if(!L.data)exit(0);
 13     return 1;
 14 }
 15 int InsertList(xianxing &L,int i,int e){//将数值e插入线性表L第i个位置
 16     if(i<1||i>L.length+1)return 0;
 17     int *k,*m;
 18     m=(L.data+i-1);
 19     for(k=(L.data+L.length-1);k>=m;--k){
 20         *(k+1)=*k;
 21     }
 22     *m=e;
 23     ++L.length;
 24     return 1;
 25 }
 26 int ListDelete(xianxing &L,int i,int &e){//删除L中第i的位置的数值,并将这个值赋值给e
 27     if(i<1||i>L.length)return 0;
 28     e=L.data[i-1];
 29     int *p;
 30     for(p=L.data+i-1;p<L.data+L.length-1;p++){
 31         *p=*(p+1);
 32     }
 33     --L.length;
 34     return 1;
 35 }
 36 int LocateElem(xianxing L,int e,int &l){//查找L中数e第一次出现的位置并赋值给l
 37     int *p;
 38     l=-1;//l=-1表示没找到,外部要判断
 39     for(p=L.data;p<=L.data+L.length-1;p++){
 40         if(*p==e){
 41             l=p-L.data;
 42             break;
 43         }
 44     }
 45 }
 46 int shuru(xianxing &L){//对已经初始化了的线性表输入一串数
 47     int i=0,t=0;
 48     while(i<ElemNum){
 49         scanf("%d",&t);//输入数值
 50         if(t==-1)break;//输入-1表示输入结束
 51         InsertList(L,i+1,t);//插入数值
 52         i++;
 53     }
 54 }
 55 int MergeList(xianxing &La,xianxing &Lb,xianxing &Lc){//合并两个线性表
 56     int *pa,*pb,*pc;
 57     int *pa_last,*pb_last;
 58     pa=La.data;
 59     pb=Lb.data;
 60     pa_last=La.data+La.length-1;
 61     pb_last=Lb.data+Lb.length-1;
 62     Lc.length=La.length+Lb.length;
 63     pc=Lc.data=(int *)malloc(Lc.length*sizeof(int));
 64     if(!Lc.data)return 0;
 65     while(pa<=pa_last)*pc++=*pa++;
 66     while(pb<=pb_last)*pc++=*pb++;
 67 }
 68 int fuzhi(xianxing La,xianxing &Lb){//复制两个线性表
 69     int *p,*q;
 70     p=La.data;
 71     q=Lb.data;
 72     for(p;p<=La.data+La.length-1;p++){
 73         *q++=*p;
 74     }
 75     Lb.length=La.length;
 76 }
 77 int clearList(xianxing &L){
 78     L.data=(int *)malloc(ElemNum*sizeof(int));
 79     L.length=0;
 80 }
 81 int getElem(xianxing L,int i,int &e){
 82     if(i<1||i>L.length)return 0;
 83     int *p;
 84     e=*(L.data+i-1);
 85     return 1;
 86 }
 87 int destroyList(xianxing &L){
 88     free(L.data);
 89     L.length=0;
 90 }
 91 int main(){
 92     /*****************定义一个线性表并输入一串数字,然后存入data.txt文件中*********************/
 93    /*
 94     xianxing L;//定义相性表L
 95     InitList(L);//初始化线性表
 96     shuru(L);
 97     printf("\n\n");
 98     int *p;
 99     FILE *fp;
100     fp=fopen("data.txt","w");
101     for(p=(L.data);p<=L.data+L.length-1;++p){
102         fprintf(fp,"%d ",*p);
103     }
104     fclose(fp);
105     */
106     /**************删除你想要删除的第几位数*****************/
107     /*int m,l=0;
108     printf("输入你想删除的第几位数:");
109     scanf("%d",&l);
110     ListDelete(L,l,m);
111     fprintf(fp,"\n\n");
112     for(p=(L.data);p<=L.data+L.length-1;++p){
113         fprintf(fp,"%d ",*p);
114     }
115     printf("删除了第%d位数%d",l,m);*/
116 
117     /***********************查找想要的数的第一次出现的位置*************************/
118 /*
119     int chazhaoshu=0;
120     printf("输入你想查找的数:");
121     while(scanf("%d",&chazhaoshu)!=EOF){//isalnum判断是不是数字
122         if(isalpha(chazhaoshu)!=0){
123             return 0;
124         }
125         int q;
126         LocateElem(L,chazhaoshu,q);
127         if(q==-1){
128             printf("抱歉没查到那个数的位置\n");
129         }else{
130             printf("你想要查找的数出现的第一次位置是在%d\n",q);
131             }
132         printf("输入你想查找的数:");
133     }
134     */
135     /*************合并两个线性表****************/
136     /*
137     xianxing La,Lb,Lc;
138     InitList(La);
139     InitList(Lb);
140     InitList(Lc);
141     shuru(La);
142     printf("\n\n");
143     shuru(Lb);
144     MergeList(La,Lb,Lc);
145     int *lc;
146     for(lc=Lc.data;lc<=Lc.data+Lc.length-1;lc++){//输出合并后的线性表
147         printf("%d\n",*(lc));
148     }
149     */
150     /********************复制线性表*************************/
151     /*
152     xianxing La,Lb;
153     InitList(La);
154     InitList(Lb);
155     shuru(La);
156     fuzhi(La,Lb);//执行复制
157     int *p;
158     for(p=Lb.data;p<=Lb.data+Lb.length-1;p++){//输出复制后的线性表
159         printf("%d\n",*p);
160     }
161     */
162     /*******************清空线性表**********************/
163 
164     xianxing L;
165     InitList(L);
166     shuru(L);
167     printf("%d %d",*(L.data+1),L.length);
168     printf("\n\n");
169     clearList(L);//清空
170     printf("%d %d",*(L.data+1),L.length);
171 
172     /*******************根据序号查找元素值***********************/
173     /*
174     xianxing L;
175     InitList(L);
176     shuru(L);
177     int m=0;
178     printf("输入你想要查找第几个元素的值");
179     scanf("%d",&m);
180     int e;
181     if(getElem(L,m,e)){
182         printf("你想要查找的数的值是%d",e);
183     }else{
184         printf("没找到");
185     }
186     */
187     /**********************销毁线性表******************************/
188 
189     return 0;
190 }
View Code

 

线性表特点:易查询,难增删;要查询一个线性表中某一个元素的值很简单,只要根据索引位置来查询就行,所以时间复杂度是O(1);但是如果要增加或者删除元素,最好的情况时间复杂度是O(1),最坏的情况是O(n);所以平均下来时间复杂度是O(n/2),再简化点就是O(n);所以线性表一般用来存储增删不太频繁的数据。

线性表学习

标签:

原文地址:http://www.cnblogs.com/hongrunhui/p/5161479.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!