c语言与数据结构(线性表之顺序表的学习)

/****************************************************************************************************

*使用编译器:C-FREE

*实现数据结构中的顺序表

*编写人:徐文才(才哥)

*****************************************************************************************************/

/**顺序表结构和工具函数实现*/

#include<stdio.h>
#include<ctype.h>

/**定义初始容量*/

#define MEMORY_CAPACITY 100

/**设置递增空间*/
#define MEMORY_INCREASE 10
/**内存是否申请成功*/
#define MEMORY_ALLOCAT_SUCCESS 1
#define MEMORY_ALLOCAT_FAILURE 0
/**顺序表是否为空
#define LIST_IS_EMPTY 1;
#define LIST_NO_EMPTY 0;
/**定义TRUE和FALUSE*/
#define TRUE  1;
#define FALSE 0;

#define NOT_EXIT -1;

/**定义顺序表的结构*/

struct LinearList{
    int *elem; // 申请空间指针,类似于指针数组
    int length;//表示所含有元素的个数
    int size;     //申请的元素内存的容量
};


/**定义类型,注意c语言中不存在引用&*/
typedef struct LinearList linearList;

 

/************************************************************************

*初始化说明:malloc申请内存,并初始化长度(length==0)

*指针的容量为MEMORY_CAPACITY,返回成功

************************************************************************/


/**顺序链表初始化*/
int InitList(linearList *linear){
    //分配内存
    linear->elem = (int*)malloc(MEMORY_CAPACITY * sizeof(int));
    
    if(!linear->elem)
       return MEMORY_ALLOCAT_FAILURE;
       
    linear->length = 0;
    linear->size = MEMORY_CAPACITY;//设置初始容量
    
    return MEMORY_ALLOCAT_SUCCESS;
}

 

/*************************************************************************

*判断链表是否为空

*根据线性表的定义,若长度length == 0则说明线性表为空

**************************************************************************/


int IsEmpty(linearList *linear){
    if(linear->length != 0){
        return FALSE;
    }
    return TRUE;
}

 

/**************************************************************************
*数据查找:使用二分法,时间复杂度,和空间复杂度比较小

*如果存在返回位置(index)
 *************************************************************************/
int LocateElem(linearList *linear,int low,int high,int number){
    int mid = (high + low)/2;
    int location = 0;
    if(linear->elem[mid] > number){
          return LocateElem(linear,mid + 1,high,number);
    }else if(linear->elem[mid] < number){
          return LocateElem(linear,low,mid - 1,number);
    }else if(linear->elem[mid] = number){
          location = mid;
          return location;
    }
    return NOT_EXIT;
}

 

/**********************************************************************

*判断直接前驱和直接后继:仅仅需要判断是不是首数据

*判断等于末尾数据

**********************************************************************/

int IsNextElem(linearList *linear,int index){

      if(index==linear->length)

          return FALSE;

       return TRUE;

}

 

int IsPriorElem(linearList *linear,int index){

    if(index-1==0)

          return FALSE;

       return TRUE;

}

 

/********************************************************************

*查看数据链表中的元素个数

*      只需要返回线性顺序结构中的length

*********************************************************************/

int NumOfElem(linearList *linear){
    return  linear->length;
}


/*********************************************************************
 *获取索引为i位置的值
 *     通过索引值获取,下标获取元素
*********************************************************************/
int getElem(linearList *linear,int index){
   if(index < 1 || index > linear->length) {
          return FALSE;
   }
   return linear->elem[index - 1];
}

/*****************************************************************************
 *插入数据

 *参数:顺序表,索要插入的位置,索要插入的数据

 *步骤分析:1.判断位置是否合法 2.判断数据是否超出容量

 *若超出则修改内存 3.数据向后移动(n-i+1)次,*(p+1) = *p

 *4.进行数据的赋值,以及长度的++。

 *渐进时间复杂度:O(n)
 ****************************************************************************/


int ListInsert(linearList *linear,int index,int number){

    if(index < 1 || index > (linear->size)+1){
        return FALSE;
    }
    linearList *newbase;
    if(index > linear->size){
        newbase = (int*)realloc((MEMORY_CAPACITY + MEMORY_INCREASE)*sizeof(int));
        
        linear->elem = newbase;
        free(newbase);
        newbase = NULL;
    }
   
    linearList *p = NULL;
    newbase = &linear->elem[index - 1];


    for(p = &linear->elem[linear->length-1];p < newbase;p++){
        *(p+1) = *p;
    }
    linear->elem[index - 1] = number;
    linear->length++;
    linear->size = MEMORY_CAPACITY + MEMORY_INCREASE;
    return TRUE;
}

 

/*****************************************************************************
 *删除数据

 *参数:顺序表,索要插入的位置,索要插入的数据

 *步骤分析:1.判断位置是否合法

 *               2.数据向后移动(n-i)次,*(p-1)=*p

 *               3.长度的--。

 *渐进时间复杂度:O(n)
 ****************************************************************************/


int ListDelete(linearList *linear,int index){
    if(index < 1 || index > linear->length){
        return FALSE;
    }
   
    int *startBase = &linear->elem[index - 1];
    int *p = NULL;

    for(p = startBase + 1;p<&(linear->elem[linear->length]);p++){
        *(p - 1) = *p;
    }

    linear->length --;
    return TRUE;
}

 

/***********************************************************

*遍历list,并输出元素,

***********************************************************/

void ListTraverse(linearList *linear){
     int i = 0;
     for(i = 0;i<linear->length;i++){
         printf("%d  ",linear->elem[i]);
     }
}

/**************************************************************

*数据链表的合并

*     返回一个线性列表 (利用归并的方法)

**************************************************************/

linearList * MergeList(linearList *list1,linearList *list2){
   int list3_len = list1->length + list2->length;
   linearList *list3;
   list3->elem = (int *)malloc(list3_len * sizeof(int));
   
   if(!list3->elem){
        exit(-1);
   }
  
   int i,k,j = 0;
   
   while(i < list1->length && j < list2->length){
        if(list1->elem[i] <= list2->elem[j]){
            list3->elem[k++] = list1->elem[i++];
        } else {
            list3->elem[k++] = list1->elem[j++];
        }
   }
   
   while(i < list1->length){
         list3->elem[k++] = list1->elem[i++];
   }
   
   while(j < list2->length){
         list3->elem[k++] = list1->elem[j++];
   }
   return list3;
}

 

/******************************************************************

*顺序表的销毁:直接进行释放

*******************************************************************/
void DestroyList(linearList *linear){
    free(linear);
    linear = NULL;
    printf("LIST DELETE SUCCESS!\n");
}

 

int  main(){

 

 

}

 

posted @ 2018-03-26 18:42  梧桐雨盖不住鹧鸪伤  阅读(252)  评论(0编辑  收藏  举报