线性表调通-C语言

189 阅读2分钟
/*
使用vc6,没办法学校要求,c语言。
*/
还需要使用者写一个完整的主函数。
/*

*/#include<stdio.h>
#include<malloc.h>

#define MAXSIZE 100

typedef int ElemType;
typedef struct
{
	ElemType elem[MAXSIZE];
	int last;
}SeqList;

void InitList(SeqList *pL);//初始化
int ListLength(SeqList *pL);//求表长度
int InsList(SeqList *L, int i, ElemType e);//在表中第i个位置插入元素e
int DelList(SeqList *L,int i,ElemType * e);//删掉表中的第i个元素,返回e值
ElemType GetData(SeqList L,int i);//顺序表中按序号查找
int Locate(SeqList L,ElemType e);//顺序表中按内容查找
SeqList * merge(SeqList *LA,SeqList *LB);//长度为m的顺序表合并到长度为n的顺序表之后  merge函数将返回一个指向顺序表的指针(即顺序表地址)

int main()
{
	SeqList *L;
	L = (SeqList *)malloc(sizeof(SeqList));
	return 0;
}

void InitList(SeqList *pL)//初始化
{
	pL->last = -1;
}

int ListLength(SeqList *pL)//求表长度
{
	return pL->last +1;
}

int InsList(SeqList *L, int i, ElemType e)//在表中第i个位置插入元素e
{  
	int k,ERROR = 0;
	if((i<1) ||(i>L->last+2)) /*首先判断插入位置是否合理*/
	{
		printf("i不符合,无法插入");
		return ERROR;
	}
	if(L->last==MAXSIZE-1) /*判断表是否已满无法插入*/
	{
		printf("表满,无法插入");
		return ERROR;
	}
	for(k=L->last;k>=i-1;k--)   /*为插入元素而移动位置*/
		L->elem[k+1]=L->elem[k]; 
	L->elem[i-1]=e; /*在C语言中数组第i个元素的下标为i-1*/ 
	L->last++; 
	return !ERROR;
}

int DelList(SeqList *L,int i,ElemType * e)//删掉表中的第i个元素,返回e值
{  
	int k, ERROR = 0;
	if((i<1)||(i>L->last+1)) /*首先判断删除位置是否合法*/
	{
		printf("删除位置不合法");
		return ERROR;
	}
	if(L->last==-1) /*判断表是否已空无法删除*/
	{
		printf("表已空无法删除");
		return ERROR;
	}
	*e=L->elem[i-1]; /*在C语言中数组第i个元素的下标为i-1*/ 
	for(k=i-1;k<L->last;k++)   /*为删除元素而移动位置*/
		L->elem[k]=L->elem[k+1]; 
	L->last--; 
	return !ERROR;
}

ElemType GetData(SeqList L,int i)//顺序表中按序号查找
{	
	if(i<1||i> L.last+1)
		printf("position error");
	return L.elem[i-1]; /*下标=序号-1,因此减1*/
}

int Locate(SeqList L,ElemType e)//顺序表中按内容查找
{	
	int i=0;  //i为扫描计数器,初值为0,即从第一个元素开始比较
	while((i<=L.last)&&(L.elem[i]!=e))   
		i++; /*顺序扫描,直到找到值为e的元素,或扫描到表尾*/
	if(i<=L.last) 
		return(i);/*若找到,则返回其下标*/
	else	
		return(-1);/*若没找到,则返回-1*/
}

//长度为m的顺序表合并到长度为n的顺序表之后  merge函数将返回一个指向顺序表的指针(即顺序表地址)
SeqList * merge(SeqList *LA,SeqList *LB)
{ 
	int j = 0, n = 5;
	SeqList *LC;
	if(LA->last < LB->last) 
	{//交换顺序表指针LA、LB  交换的目的是为了减少后面的赋值操作次数
		LC = LA;
		LA = LB;
		LB = LC;
	}
	while(j <= LB->last) //当表LB还没有扫描完
	{//将表LB余下的元素赋给表LA
		LA->elem[n++]=LB->elem[j++]; 
	}
	LA->last = LA->last + LB->last+1;
	return LA;
}