标签:
线性表是最常用也是最简单的一种数据结构,一个线性表是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 }
线性表特点:易查询,难增删;要查询一个线性表中某一个元素的值很简单,只要根据索引位置来查询就行,所以时间复杂度是O(1);但是如果要增加或者删除元素,最好的情况时间复杂度是O(1),最坏的情况是O(n);所以平均下来时间复杂度是O(n/2),再简化点就是O(n);所以线性表一般用来存储增删不太频繁的数据。
标签:
原文地址:http://www.cnblogs.com/hongrunhui/p/5161479.html