线性表

线性表

#include <stdio.h>
#include <stdbool.h>


#define LISTSIZE 100
typedef int DataType;
typedef struct SeqList
{
	DataType data[LISTSIZE];
	int nlength;
} SeqList;

/**
 * 初始化线性表
 */
void initList(SeqList *list)
{
	list->nlength = 0;
}


/**
 * 验证线性表是否为空
 */
bool listEmpty(SeqList *list)
{
	return list->nlength == 0;
}

/**
 * 清空线性表
 */
void clearList(SeqList *list)
{
	list->nlength = 0;
}

/**
 * 通过下标查找元素 
 */
DataType *getNode(SeqList *list, int i)
{
	if(i < 0 || i > list->nlength - 1) 
		return NULL;
	
	return &list->data[i];

}

/**
 * 查找元素的位置 
 */
int locateNode(SeqList *list, DataType x)
{
	for(int i = 1; i < list->nlength; i++)
		if(list->data[i] == x)
			return i;
	
	return -1;
}

/**
 * 将元素插入线性表
 */
bool insert(SeqList *list, int i, DataType x)
{
	if(list->nlength == LISTSIZE)
		return false;
	
	int insertPosition = i;
	if(i < 0)
		insertPosition = 0;
	
	if(i > list->nlength - 1){
		insertPosition = list->nlength;
	}

	for(int j = list->nlength - 1; j >= insertPosition; j--){
		list->data[j+1] = list->data[j];
	}

	list->data[insertPosition] =  x;
	list->nlength++;

	return true;
}

/**
 * 根据下标删除元素
 */
bool deleteList(SeqList *list, int i)
{
    if(i < 0 || i >= list->nlength){
        return false;
    }

    for(int j = i; j < list->nlength;j++){
        list->data[j] = list->data[j+1];
    }

    list->nlength--;

    return false;
}

/**
 * 线性表合并
 */
void unionList(SeqList *a, SeqList *b)
{
   if(a->nlength + b->nlength > LISTSIZE){
       return ;
   }

   for(int i = 0; i < b->nlength; i++){
       DataType e = b->data[i];
       if(locateNode(a, e) == -1){
           insert(a, a->nlength, e);
       }
   }
}

/**
 * 倒置线性表
 */
void reverse(SeqList *list)
{
    for(int i = 0; i < list->nlength / 2; i++){
        DataType e = list->data[i];
        list->data[i] = list->data[list->nlength-i-1];
        list->data[list->nlength-i-1] = e;     
    }
}

/**
 * 输出元素
 */
void print(DataType d)
{
    printf("%dn", d);
}

/**
 * 遍历元素
 */
void trave(SeqList *list, void(*visitFun)(DataType))
{
    for(int i = 0; i < list->nlength; i++){
        visitFun(list->data[i]);
    }
}