线性表
线性表的基本操作:
VS2010
#include <stdio.h> #include <malloc.h> #include <system_error> typedef struct { int * elem; int Length; int Listsize; }LinerList; ///初始化一个线性表 length:线性表长度 void InitList(LinerList & L,int length) { if (length<0) { exit(-1); } L.elem=(int *)malloc(length*sizeof(int)); if (!L.elem) { exit(-1); } L.Length=0; L.Listsize=length; } ///插入元素,e:插入的元素,p:插入的位置 void InsertElem(LinerList & L,int e,int p) { if (!L.elem||p<0) { exit(-1); } if (p>L.Length+1) { int *newelem=(int *)realloc(L.elem,(10+L.Length)*sizeof(int)); if (!newelem) { exit(-1); } L.Listsize+=10; } for (int *m=&L.elem[L.Length-1];m>=&L.elem[p-1];m--) { *(m+1)=*m; } L.elem[p-1]=e; L.Length++; }
///删除元素,p:元素位置 void DeleteElem(LinerList & L,int p) { if (!L.elem||p<0||p>L.Length) { exit(-1); } int *t=&L.elem[p-1]; for (int *m=&L.elem[p-1];m<&L.elem[L.Length];m++) { *m=*(m+1); } L.Length--; } ///判断元素e是否存在于线性表中 int ExistElem(LinerList &L,int e) { if (!L.elem) { exit(-1); } int temp=0; for (int *m=L.elem;m<&L.elem[L.Length];m++) { if (*m==e) { temp=0; break; } else { temp=1; } } return temp; } ///将Lb中不在线性表La中的元素插入到La中 void MergeList(LinerList &La,LinerList &Lb) { if (!La.elem||!Lb.elem) { exit(-1); } for (int *m=Lb.elem;m<&Lb.elem[Lb.Length];m++) { if (ExistElem(La,*m)==1) { InsertElem(La,*m,La.Length+1); } } }
///简单的冒泡排序 void Sort(LinerList &L) { if (!L.elem) { exit(-1); } for (int *m=L.elem;m<&L.elem[L.Length];m++) { for (int *n=m;n<&L.elem[L.Length];n++) { if (*m>*n) { int temp=*m; *m=*n; *n=temp; } } } }
///快速排序,第一次排序 int QuickSort(LinerList &L,int i,int j) { if (!L.elem) { exit(-1); } int k=L.elem[i]; while(i<j) { while(i<j&&L.elem[j]>=k) { --j; } int temp=L.elem[j]; L.elem[j]=L.elem[i]; L.elem[i]=temp; while(i<j&&L.elem[i]<=k) ++i; temp=L.elem[i]; L.elem[i]=L.elem[j]; L.elem[j]=temp; } return i; }
///快速排序全过程,有点简单,只是实现了基本的排序功能 void QSort(LinerList &L,int low,int high) { if (!L.elem) { exit(-1); } if(low<high) { int pivotloc=QuickSort(L,low,high); QSort(L,low,pivotloc-1); QSort(L,pivotloc+1,high); } } ///Print the exist linerlist; void PrintList(LinerList & L) { if (!L.elem) { exit(-1); } printf("LinerList Elements are : \n"); for (int *m=L.elem;m<&L.elem[L.Length];m++) { printf("%d ",*m); } printf("\n"); puts("LinerList Length is :\0"); printf("%d \n",L.Length); puts("LinerList ListSize is :\0"); printf("%d \n",L.Listsize); } void main() { LinerList La; InitList(La,100); InsertElem(La,27,1); InsertElem(La,13,1); InsertElem(La,76,1); InsertElem(La,97,1); InsertElem(La,65,1); InsertElem(La,38,1); InsertElem(La,45,1); PrintList(La); QSort(La,0,La.Length); PrintList(La); getchar(); }