数据结构(c语言)之顺序表的实现和建立

一。建立status.h头文件

   #ifndef STATUS_H  //防止头文件的重复包含和编译(if not difine,如果不存在)
   #define STATUS_H   //就引入STATUS_H
   //函数结果状态代码
   #define TRUE 1
   #define FALSE 0
   #define OK 1
   #define ERROR 0
   #define INFEASIBLE -1
   #define OVERFLOW -2
    //Status是函数的类型,其值是函数结果状态代码
   typedef int Status;
   typedef int ElemType;
    #endif

二、建立’Sqlish.h文件

    #ifndef  SQLIST_H
    #define SQLIST_H
    #include <stdio.h>
    #include "status.h"
        //线性表的动态分布顺序存储结构
    #define LIST_INIT_SIZE 100  //初始化表的存储空间
    #define LISTINCREMENT 10  //分配存储空间的增量
    typedef struct{
          ElemType  *elem; //数组指针elem指示表的基地址
          int length;
          int listsize;  //当前容量
    }SqList;
    Status InitList (SqList *L);
int ListLength(SqList L);
int IsEmpty(SqList L);
int GetElem(SqList L,int i,ElemType *e);
Status ListInsert(SqList *L,int i,ElemType e);
 void ListTraverse(SqList L);
 void MergeList(SqList La,SqList Lb,SqList *Lc);
 Status ListDelete(SqList *L,int i,ElemType *e);
  void ClearList(SqList *L);
  void DestroyList(SqList *L);
  
 #endif   

`
三。建立Sqlish.c文件,里边是具体方法

 #include <stdio.h>
    #include "Sqlist.h"
    Status InitList(SqList *L){//建立一个空表,顺序表的初始化
    (*L).elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType))://动态分配空间
    if(!(*L).elem) exit(OVERFLOW);
    (*L).length=0;
    (*L).listsize=LIST_INIT_SIZE;
    return OK;
}

int ListLength(SqList  L){
     return (L.length);
}
int IsEmpty(SqList L){
  return (L.length==0? TRUE:FALSE);
}
int GetElem(SqList L,int i,ElemType *e){
       if(i<1||i>L.length) return ERROR;//判断是否合理
       *e=L.elem[i-1];//数组中第i-1的单元存储线性表中第i个数据元素的内容
       return OK;
}
Status ListInsert(SqList *L,int i,ElemType e) /* 算法2.4 */
 { /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1 */
   /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
   ElemType *newbase,*q,*p;
   if(i<1||i>(*L).length+1) /* i值不合法 */
     return ERROR;
   if((*L).length>=(*L).listsize) /* 当前存储空间已满,增加分配 */
   {
     newbase=(ElemType *)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType));
     if(!newbase)
       exit(OVERFLOW); /* 存储分配失败 */
     (*L).elem=newbase; /* 新基址 */
     (*L).listsize+=LISTINCREMENT; /* 增加存储容量 */
   }
   q=(*L).elem+i-1; /* q为插入位置 */
   for(p=(*L).elem+(*L).length-1;p>=q;--p) /* 插入位置及之后的元素右移 */
     *(p+1)=*p;
   *q=e; /* 插入e */
   ++(*L).length; /* 表长增1 */
   return OK;
 }
 void ListTraverse(SqList L){//遍历
	int i;
	for(i=0;i<L.length;i++){
		printf("%d,",L.elem[i]);
		
	} 
	printf("\n");
} 
void MergeList(SqList La,SqList Lb,SqList *Lc){//顺序表的合并 
	ElemType *pa,*pb,*pc,*pa_last,*pb_last;
	pa=La.elem;pb=Lb.elem;
	Lc->listsize=Lc->length=La.length+Lb.length;
	pc=Lc->elem=(ElemType *)malloc(Lc->listsize*sizeof(ElemType));//开辟空间 
	if(!Lc->elem)exit(OVERFLOW);//存储失败 
	pa_last=La.elem+La.length-1;
	pb_last=Lb.elem+Lb.length-1;
	while(pa<=pa_last&&pb<=pb_last){//递归合并 
		if(*pa<=*pb){
			*pc++=*pa++;	
		}else{
			*pc++=*pb++;
		}	
	}
	while(pa<=pa_last)*pc++=*pa++;//插入la的剩余元素 
	while(pb<=pb_last)*pc++=*pb++;	//
}
Status ListDelete(SqList *L,int i,ElemType *e)//删除某一数据
 { /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
   /* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
   ElemType *p,*q;
   if(i<1||i>(*L).length) /* i值不合法 */
     return ERROR;
   p=(*L).elem+i-1; /* p为被删除元素的位置 */
   *e=*p; /* 被删除元素的值赋给e */
   q=(*L).elem+(*L).length-1; /* 表尾元素的位置 */
   for(++p;p<=q;++p) /* 被删除元素之后的元素左移 */
     *(p-1)=*p;
   (*L).length--; /* 表长减1 */
   return OK;
 }
 //清空
 void ClearList(SqList *L){
 	(*L).length=0;//将线性表的长度置为0 
 } 
 //销毁线性表 
void DestroyList(SqList *L){
	free((*L).elem);//释放内存后置空指针
	(*L).elem=NULL;
	(*L).length=0; 
	(*L).listsize=0;//释放线性表占据的所有存储空间 
}

四。建立main_Sqlish.c文件

    #include<stdio.h>
    #include "Sqlist.h"
    
    
    int main(){
    	SqList L,La,Lb;
    	int i;
    	ElemType m,*p;
    	p=&m;
    	InitList(&L);
    	printf("判断线性表是否为空0否1是:%d\n",IsEmpty(L));
    	printf("该线性表的长度是:%d\n",ListLength(La));
    InitList(&La);
	ListInsert(&La,1,1);
	ListInsert(&La,2,2);
	ListInsert(&La,3,3);
	ListInsert(&La,4,4);
    GetElem(La,3,p);//或去某一位置上的元素
    printf("第%d位置的元素为:%d\n",3,*p);
    printf("合并前la的顺序表为:\n");
    ListTraverse(La);
    InitList(&Lb);
    ListInsert(&Lb,1,6);
	ListInsert(&Lb,2,7);
	ListInsert(&Lb,3,8);
	ListInsert(&Lb,4,9);
	printf("合并前lb的顺序表为:\n");
	ListTraverse(Lb);
    MergeList(La,Lb,&Lc);
	printf("合并后的顺序表为:\n");
   ListTraverse(Lc);
   printf("该线性表的长度是:%d\n",ListLength(La));
     ListDelete(&Lb,2,p);
    printf("被删除的元素为%d:\n",*p);
   ClearList(La);
   printf("该线性表的长度是:%d\n",ListLength(La));
    	DestroyList(La);
  
    }

猜你喜欢

转载自blog.csdn.net/qq_43615815/article/details/89406996
今日推荐