单链表的实现(部分)

接下来总结一下线性表的线性链表存储结构:由于单链表的数据元素之间的逻辑关系是由结点中的指针指示的,指针的指向连接了单链表中各个结点的逻辑关系。

以下是线性表的单链表存储结构:

typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;

然后,分别用各个函数来实现单链表的功能,如创建,显示,插入,删除,查找。

以下是源程序:

//预编译命令
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//数据结构
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;
//函数首部
int menu_select();
void CreateList_L(LinkList &L,int n);
void PrintList_L(LinkList L);
Status GetElem_L(LinkList &L,int i, ElemType &e);
Status ListInsert_L(LinkList &L,int i,ElemType e);
Status ListDelete_L(LinkList &L,int i,ElemType &e);

//主函数
int main()
{	
	ElemType e;
	LinkList L;
	Status s;
	int n,i;
	for(;;)
	{
		switch(menu_select())
		{
		case 1:
			printf("请输入单链表的长度:");
			scanf("%d",&n);
			CreateList_L(L,n);
			printf("创建成功。\n");
			break;
		case 2:
			printf("单链表中的元素是:\n");
			PrintList_L(L);
			break;
		 case 3:
			printf("请输入待查元素的位序:");
			scanf("%d",&i);
			s=GetElem_L(L,i,e);
			if(s)
				printf("第%d个元素的值为%d",i,e);
			else
				printf("查找失败。\n");
			break;
		 case 4:
			printf("请输入插入的位序和新元素的值(以空格分开):");
			scanf("%d%d",&i,&e);
			s=ListInsert_L(L,i,e);
			if(s)
				printf("插入成功\n");
			else
				printf("插入失败\n");	
			break;
		 case 5:
			printf("请输入删除的位序:");
			scanf("%d",&i);
			s=ListDelete_L(L,i,e);
			if(s)
				printf("删除了元素%d成功\n",e);
			else
				printf("删除失败\n");		
			break;
		case 0:
			printf("程序结束,谢谢使用!\n\n");
			exit(0);
		}
	}
	return 0;
}

int menu_select()
{
	int sn;
	printf("\n显示菜单\n");
	printf("1.创建\n");
	printf("2.显示\n");
	printf("3.取元素\n");
	printf("4.插入\n");
	printf("5.删除\n");
	printf("0.退出\n");
	printf("输入 0-6:");
	for(;;)
	{
		scanf("%d",&sn);
		if(sn<0||sn>5)
			printf("\n输入错误,重选0-5:");
		else
			break;
	}
	return sn;
}
//创建函数
void CreateList_L(LinkList &L,int n)
{
	LinkList p;
	int i;
	L=(LinkList)malloc(sizeof(LNode));
	L->next=NULL;
	printf("请输入%d个数据元素(整型数):\n",n);
	for(i=n;i>0;i--)
	{
		p=(LinkList)malloc(sizeof(LNode));
		scanf("%d",&p->data);
		p->next=L->next;
		L->next=p;
	}
}
//输出函数
void PrintList_L(LinkList L)
{
	LinkList p;
	p=L->next;
	while(p)
	{
		printf("%d\t",p->data); // \t:分隔符
		p=p->next;
	}
	printf("\n");
}
//查找函数
Status GetElem_L(LinkList &L,int i, ElemType &e)
{
	LinkList p;
	p=L->next;
	int j=1;
	while(p&&j<i)
	{
		p=p->next;
		++j;
	}
	if(!p||j>i)
		return ERROR;
	e=p->data;
	return OK;
}
//插入函数
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
    LinkList p,s;
	p=L;
	int j=0;
	while(p&&j<i-1)
	{
		p=p->next;
		++j;
	}
	if(!p||j>i-1)
		return ERROR;
	s=(LinkList)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return OK;
}
//删除函数
Status ListDelete_L(LinkList &L,int i,ElemType &e)
{
	int j=0;
	LinkList p,q;
	p=L;
	while(p->next&&j<i-1)
	{
		p=p->next;
		++j;
	}
	if(!(p->next)||j>i-1)
		return ERROR;
	q=p->next;
	p->next=q->next;
	e=q->data;
	free(q);
	return OK;	
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值