DS||线性表链式存储结构

#include<stdio.h>  
#include<malloc.h> 
#define OK 1 //执行成功 
#define ERROR 0 //执行出错 
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;
typedef struct LinkNode
{
	ElemType data; //数据域 
	struct LinkNode *next; //指针域 
} LinearNode;
typedef struct
{
	LinkNode *head;
}LinearList; //记录头结点指针 
void ElemInput(ElemType *e) //输入 
{
	scanf("%d",e);
};
void ElemOutput(ElemType e) //输出 
{
	printf("%d",e);
};
//1.初始化线性表,申请空间 
Status InitList(LinearList *Lp)
{
	Lp->head = (LinkNode *)malloc(sizeof(LinkNode));
	if(Lp->head==NULL)
		return ERROR;
	Lp->head->next=NULL;
	return OK; 
}
 
//2.销毁线性表,释放空间 
Status DestoryList(LinearList *Lp)
{
	LinkNode *p = Lp->head, *pnext;
	while(p!=NULL)
	{
		pnext = p->next;
		free(p);
		p = pnext;
	}
	Lp->head = NULL;
	return OK;
}
//3.取线性表的长度 
Status GetLength(LinearList L,int *lenp)
{
	LinkNode *p=L.head;
	int len=0;
	if(p==NULL)
		return ERROR; //未初始化 
	while(p)
	{
		p=p->next;
		len++; //最后一个元素p=NULL时p也加1了,所以len比实际长度大1 
	}
	*lenp = (len-1); //要加括号 
	return OK;
}
//4.判断线性表是否为空 
Status IsEmpty(LinearList L,int *emptyp)
{
	if(L.head==NULL)
		return ERROR;
	*emptyp = (L.head->next==NULL);
	return OK;
}
//5.指定位置插入元素 
Status Insert(LinearList *Lp,int i,ElemType e)
{
	LinkNode *p = Lp->head,*newnode; //newnode记录新插入结点的地址
	int j=0;
	for(;j<i-1;j++) //找到插入位置的前一个结点 
	{
		if(p==NULL) //i超过了表长 ,同时如果线性表未被初始化也会break 
			break;
		p=p->next;
	}
	if(j<i-1 || i<1) //循环通过break退出 ,此条件可改为j!=i-1 
		return ERROR;
	newnode = (LinkNode *)malloc(sizeof(LinkNode)); //建立新结点,从内存中新申请一个空间 
	newnode->data = e;
	newnode->next=p->next;
	p->next=newnode;
	return OK;
}
//6.删除指定位置元素 
Status Delete(LinearList *Lp,int i,ElemType *ep)
{
	LinkNode *p = Lp->head,*deletenode; //deletenode记录删除结点的地址
	int j=0;
	for(;j<i-1;j++) //找到插入位置的前一个结点 
	{
		if(p==NULL || p->next==NULL) //i超过了表长或第i个位置元素为空 ,同时如果线性表未被初始化也会break 
			break;
		p=p->next;
	}
	if(j<i-1 || i<1) //循环通过break退出 ,此条件可改为j!=i-1 
		return ERROR;
	deletenode=p->next;
	p->next=deletenode->next;
	free(deletenode);
	return OK;
}
//7.取指定位置元素值 
Status GetData(LinearList L,int i,ElemType *ep)
{
	LinkNode *p = L.head;
	int j=0;
	if(i<0) //如果i为负数那么下面的循环会进入死循环 
		return ERROR;
	for(j=0;j<i;j++)
	{
		if(p==NULL)
			break;
		p=p->next;
	}
	if(j!=i)
		return ERROR;
	*ep=p->data;
	return OK;
}
//8.查询指定元素值在表中的位置 
Status Locate(LinearList L,ElemType e,int *locp)
{
	LinkNode *p;
	int cnt=0;
	if(L.head==NULL)
		return ERROR;
	p=L.head->next; //从第一个结点开始 
	while(p!=NULL)
	{
		cnt++;
		if(p->data==e)
			break;
		p=p->next;
	}
	if(p == NULL)
		*locp=0;
	else
		*locp=cnt;
	return OK;
}
//9.依次输出线性表中所有数据元素 
Status Print(LinearList L,char split) //split为元素间隔符 
{
	LinkNode *p;
	if(L.head==NULL)
		return ERROR;
	p=L.head->next; //从第一个结点开始 
	while(p!=NULL)
	{
		ElemOutput(p->data);
		printf("%c",split);
		p=p->next;
	}
	printf("\n");
	return OK;
}
int main()
{
	int order,i,len,empty;
	LinearList L;
	L.head=NULL; //由于这个LinearList封装了一个指针所以必须进行初始化,这一点是和顺序存储结构不同的 
	ElemType e;
	do
	{
		printf("====线性表的基本操作演示程序====\n"); 
		printf("==1.初始化创建线性表============\n");
		printf("==2.销毁线性表==================\n");
		printf("==3.查询线性表的长度============\n");
		printf("==4.判断线性表是否为空==========\n");
		printf("==5.执行元素插入操作============\n");
		printf("==6.执行元素删除操作============\n");
		printf("==7.查询指定位置元素============\n");
		printf("==8.查询指定元素位置============\n");
		printf("==9.依次输出所有的数据元素======\n");
		printf("================================\n");
		printf("请输入操作指令序号:");
		scanf("%d",&order);
		
		switch(order)
		{
			case 1:
				if(InitList(&L)==OK)
					printf("操作成功,线性表已被初始化\n");
				else
					printf("线性表初始化失败,空间不足\n");
				break;
			case 2:
				if(DestoryList(&L)==OK)
					printf("操作成功,所占空间已被全部释放\n");
				else
					printf("操作失败,线性表未被初始化\n");
				break;
			case 3:
				if(GetLength(L,&len)==OK)
					printf("当前线性表长度为:%d\n",len);
				else
					printf("操作失败,线性表未被初始化\n");
				break;
			case 4:
				if(IsEmpty(L,&empty)==ERROR)
					printf("操作失败,线性表未被初始化\n");
				else if(empty)
					printf("当前线性表为空\n");
				else 
					printf("当前线性表不为空\n");
				break;
			case 5:
				printf("请依次输入插入位置及元素值(空格隔开):");
				scanf("%d",&i);
				ElemInput(&e);
				if(Insert(&L,i,e)==OK)
					printf("元素插入成功\n");
				else
					printf("元素插入失败\n");
				Print(L,' ');
				break;
			case 6:
				printf("请输入要删除的元素位置:");
				scanf("%d",&i);
				if(Delete(&L,i,&e)==OK)
					printf("元素删除成功\n",e);
				else
					printf("元素删除失败\n");
				Print(L,' ');
				break;
			case 7:
				printf("请输入要查询的元素位置:");
				scanf("%d",&i);
				if(GetData(L,i,&e)==OK)
					printf("查询成功,该元素为:%d\n",e);
				else
					printf("元素查询失败\n");
				break;
			case 8:
				printf("请输入要查询的元素值:");
				ElemInput(&e);
				if(Locate(L,e,&i)==ERROR || i<1)
					printf("元素查询失败\n");
				else
					printf("查询成功,该元素所在位置为:%d\n",i);
				break;
			case 9: 
				if(Print(L,' ')==ERROR)
					printf("打印成功\n");
				break;
		}
		printf("\n\n");
	}while(order>0);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值