线性表基本运算在单链表中的实现

#include <stdio.h>
#include <malloc.h>
#define Maxsize 50;
typedef int ElemType;  //假设ElemType为int类型,使用以下自定义类型语句:
typedef struct LNode  
{
	ElemType data;     //存放元素值 
	struct LNode *next;//指向后继节点 
}LinkNode;             //单链表结点类型 

//1.初始化线性表LinkList *&L 
void InitList(LinkNode *&L)
{
	L=(LinkNode *)malloc(sizeof(LinkNode));
	L->next=NULL;      //创建头结点,其next域置为NULL 
}
 
//2.销毁线性表DestroyList(&L)
void DestroyList(LinkNode *&L)
{
	LinkNode * pre=L,*p=L->next;//per指向结点p的前驱节点 
	while(p != NULL)               //扫描单链表L 
	{
		free(pre);               //释放pre结点 
		pre=p;                   //per、p同步后移一个结点 
		p=pre->next;	
	}
	free(pre);         //循环结束时p为NULL,pre指向尾结点,释放它 
} 

//3.判断线性表是否为空表ListEmpty(L)
bool ListEmpty(LinkNode *L)
{
	return(L->next==NULL);
} 

//4.求线性表的长度ListLength(L)
int ListLength(LinkNode *L)
{
	int n=0;
	LinkNode *p=L;        //p指向头结点,n置为0(即头结点的序号为0) 
	while(p->next != NULL) 
	{
		n++;
		p=p->next;
	}
	return(n);            //循环结束,p指向尾结点,其序号n为结点个数 
} 

//5.输出线性表DispList(L)
void DisNode(LinkNode *L)
{
	LinkNode *p=L->next; //p指向首结点 
	while(p != NULL)     //p不为NULL,输出p结点的data域 
	{
		printf("%d ",p->data);
		p=p->next;       //p移向下一个结点 
	} 
	printf("\n"); 
} 

//6.求线性表中的某个数据元素值GetElem(L,i,&e)
bool GetElem(LinkNode *L,int i,ElemType &e)
{
	int j=0;
	LinkNode *p=L;          //p指向头结点,j置为0(即头结点的序号为0) 
	if(i <= 0) return false;//i错误返回假 
	while (j<i && p!=NULL)  //找第i个结点p 
	{
		j++;
		p=p->next; 
	}
	if(p == NULL)             //不存在第i个数据结点,返回false 
		return false;        
	else
	{                       //存在第i个数据结点,返回true 
		e=p->data;
		return true;
	}
} 

//7.按元素值查找LocateElem(L,e)
int LocateElem(LinkNode *L,ElemType e)
{
	int i=1;
	LinkNode *p=L->next;         //p指向首结点,i置为1,(即首结点的序号为1) 
	while(p!=NULL && p->data!=e) //查找data值为e的结点,其序号为i 
	{
		p=p->next;                
		i++;
	}
	if(p == NULL)                //不存在值为e的结点,返回0 
		return 0;
	else                         //存在值为e的结点,返回其逻辑序号i 
		return (i); 
}

/*8、插入数据元素(&L,i,e)
先在单链表L中找到第i-1个结点,由p指向它。若存在这样的结点
将值为e的结点(s指向它)插入到p所指结点的后面 
*/ 
bool ListInsert(LinkNode *&L,int i,ElemType e)
{
	int j=0;
	LinkNode *p=L, *s;      //p指向头结点,j置为0(即头结点的序号为0) 
	if(i<=0) return false;  //i错误返回false
	while (j<i-1 && p!=NULL)//查找第i-1个结点p 
	{
		j++;
		p=p->next;
	} 
	if(p==NULL)             //未找到第i-1个结点,返回false 
		return false;
	else                    //找到第i-1个结点p,插入新结点并返回true 
	{
		s=(LinkNode *)malloc(sizeof(LinkNode));
		s->data=e;          //创建新结点s,其data域置为e 
		s->next=p->next;    //将结点s插入到结点p之后 
		p->next=s;          //大话数据结构P55 
		return true;
	} 
} 

//9.删除数据元素ListDelete(&L,i,&e)
bool ListDelete(LinkNode *&L,int i,ElemType &e)
{
	int j=0;
	LinkNode *p=L,*q;
	if(i <= 0)return false;
	while(j<i-1 && p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p == NULL)
		return false;
	else
	{
		q=p->next;
		if(q == NULL)
			return false;
		e=q->data;
		p->next=q->next;
		free(q);
		return true;
	}
} 
int main()
{
	LinkNode *h;
	ElemType e;
	printf("单链表的基本运算如下:\n");
	printf("1.初始化单链表h:");
	InitList(h);
	printf("2.依次采用尾插法插入10,20,30,40,50元素:\n");
	ListInsert(h,1,10);
	ListInsert(h,2,20);
	ListInsert(h,3,30);
	ListInsert(h,4,40);
	ListInsert(h,5,50);
	printf("3.输出单链表h:");
	DisNode(h);
	printf("4.单链表h的长度为:%d\n",ListLength(h));
	printf("5.单链表h为:%s\n",(ListEmpty(h)?"空":"非空"));
	GetElem(h,5,e);
	printf("6.单链表h的第五个元素是:%d\n",e);
	printf("7.元素20的位置:%d\n",LocateElem(h,20));
	printf("8.在第4个元素位置插入元素35\n");
	ListInsert(h,4,35);
	printf("9.输出单链表h:");
	DisNode(h);
	printf("10.删除单链表h的第3个元素:\n");
	ListDelete(h,3,e);
	printf("11.输出单链表h:");
	DisNode(h);
	printf("12.释放单链表h:");
	DestroyList(h); 		
}
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值