链性表的练习

#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define OVERLOW -2
typedef int ElemType;
typedef int Status;
typedef struct sqlist{
	ElemType data;//数据域 
	struct sqlist *next;//指针域 
}SqList;
//得到该线性表的长度
int GetLen(SqList *L){
	if(!L){
		printf("线性表为空,可能未创建或被销毁\n");
		return ERROR;
	}
	int len=0;
	while(L!=NULL){
		len++;
		L = L->next;
	}
	return len;
} 
//打印线性表的信息
Status PrintSqList(SqList *L){
//	int GetLen(SqList *L); //声明要调用的函数,如果该函数在本函数的上面,那么就可以不用声明 
	if(!L){
		printf("线性表为空,可能未创建或被销毁\n");
	}
	int len=GetLen(L); 
	printf("长度:%d\n",len);
	printf("元素列表:");
	while(L!=NULL){
		printf("%d,",L->data);	
		L=L->next;
	}
	printf("\n");
	return OK;
} 
//初始化线性表
SqList * InitSqList(SqList *L){
	L=(SqList *)malloc(sizeof(SqList));//作为头结点 
	L->data=-1;
	L->next=NULL;
	return L;
}
//对该线性表添加内容
SqList * AddElem(SqList *L,ElemType	e,int i){
	if(!L){
		printf("线性表为空,可能未创建或被销毁\n");
		return NULL;
	}
	int length=GetLen(L);
	if(i<1 || i>length+1){//可以插入在最后 
		printf("插入的位置错误,不在线性表的范围之内");
		return L; 
	}
	SqList *head=L;
	SqList *temp=(SqList *)malloc(sizeof(ElemType));
	temp->data=e;
	for(int j=0;j<=length;j++){
		if(j==i-1){//第一个 
			temp->next=L->next;
			L->next=temp;
		}
		L=L->next;
	}
	return head;
} 
//对该线性表删除第几个元素
SqList * DelElem(SqList *L,int i){
	if(!L){
		printf("线性表为空,可能未创建或被销毁\n");
		return NULL;
	}
	int length=GetLen(L);
	if(length==0){
		printf("表已经为空,不用进行删除操作\n");
	}
	if(i<1 || i>length){
		printf("删除的位置有误,不在线性表的范围之内\n");
	}
	SqList *head=L;
	for(int j=0;j<length;j++){
		if(j==i-2&&j>0 ||j==i-1&&j==0){//得到当前删除的前一个节点, 
			SqList *temp=L->next;
			L->next=L->next->next;
			free(temp);//释放要删除的节点 
			return head;
		}
		L=L->next;
	}
	return head;
} 
//取得第几个元素,在当前线性表中
ElemType GetElem(SqList *L,int i){
	if(!L){
		printf("线性表为空,可能未创建或被销毁\n");
		return NULL;
	}
	int length=GetLen(L);
	if(i<1 || i>length){
		printf("获得元素的位置有误,不在线性表的范围之内\n");
		return OVERLOW;
	}
	SqList *p=L->next;//获得第一个元素 ,因为L是为头结点而不是第一个元素
	for(int j=0;j<length;j++){
		if(j==i-1){
			return p->data;
		}
		p=p->next;
	} 
	return ERROR;
} 

int main(){
	SqList *L;
	L=InitSqList(L);
	PrintSqList(L);
	AddElem(L,8,1);
	PrintSqList(L);
	AddElem(L,4,1);
	PrintSqList(L);
//	DelElem(L,1);
//	PrintSqList(L); 
	int e=GetElem(L,1);
	printf("%d\n",e);
	
	return 0;
} 

你可能感兴趣的:(链性表的练习)