单链表的基本算法实现及其优化

#include<stdio.h>
#include<stdlib.h>

typedef int ElemType; 

typedef struct Node{
	ElemType data;
	struct Node *next;
}Slink;
//创建单链表结构体 
void InitList(Slink *&h)
{
	h=(Slink*)malloc(sizeof(Slink));
	h->next=NULL;
 } 
 //初始化单链表 
 
 void Destroy(Slink *&h)
 {
 	Slink *pre=h,*p=pre->next;
 	while(p!=NULL)
 	{
 		free(pre);
 		pre=p;
 		p=p->next;
	 }
	 free(pre);
 }
 //销毁单链表 
 bool listEmpty(Slink *h)
 {
 	return (h->next==NULL);
 }
 
 int ListLength(Slink *h)
 {
 	int n=0;
 	Slink *p=h->next;
 	while(p!=NULL)
 	{
 		n++;
 		p=p->next;
	 }
	 return n;
 }
 //判断单链表是否为空
 //true or false
 //空 or 非空 
 void DispList(Slink *h)
 {
 	Slink *p=h->next;
 	while(p!=NULL)
 	{
 		printf("%d\t",p->data);
 		p=p->next;
	 }
	 printf("\n");
 	
  } 
  
  //打印单链表 
int getElem(Slink *h,int i,ElemType *e)
  {
  	int j=0;
  	Slink *p=h;
  	if(i<0)
  	return false;
  	while(j<i&&p!=NULL)
  	{
  		j++;
  		p=p->next;
  		
	  }
	  if(p==NULL)
	  return false;
	  else
	  {
	  	*e=p->data;
	  	return j;
	  }
  }
  //获取指定位置元素 
  int LocateElem(Slink *h,ElemType e)
  {
  	int i=1;
  	Slink *p=h->next;
  	while(e!=p->data&&p!=NULL)
  	{
  		p=p->next;
  		i++;
	  }
	  if(p==NULL)
	  return 0;
	  else 
	  return i;
  }
  //获取指定元素位置 
  int CreatList(Slink *&h,ElemType a[],int n)
  {
  	Slink *s,*tc;
  	InitList(h);
  	tc=h;
  	for(int i=0;i<n;i++)
  	{
  		s=(Slink*)malloc(sizeof(Slink));
  		s->data=a[i];
  		tc->next=s;
  		tc=s;
	  }
	  
	  tc->next=NULL;
  }
  //运用尾插法建表 
  bool ListInsert(Slink *h,int i,ElemType e)
  {
  	int j=0;
  	Slink *p=h,*s;
  	if(i<0)
  		return false;
  	while(j<i-1&&p!=NULL)
  	{
  		p=p->next;
  		j++;
	  }
	  if(p==NULL)
	  return false;
	  else
	  {
	  	s=(Slink*)malloc(sizeof(Slink));
	  	s->data=e;
	  	s->next=p->next;
	  	p->next=s;
	  	return true;
	  	
	  }
  }
  
  //在指定位置插入指定元素 
  bool ListDelete(Slink *&h,int i,ElemType e)
  {
  	int j=0;
  	Slink *p=h,*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()
 {
 	ElemType e,a[5],Pos,obj,InsertElem,InsertPos,DeletePos,DeleteElem;
	 printf("请输入数组元素:\n");
	 for(int i=0;i<5;i++)
	 {
	 	scanf("%d",a+i);
	  } 
	  Slink *h;
	  InitList(h);
	  printf("依次采用尾插法插入元素\n");
	  CreatList(h,a,5);
	  printf("输出单链表:\n");
	  DispList(h);
	  printf("单链表的长度:length=%d\n",ListLength(h));
	  printf("判断单链表是否为空?%s\n",(listEmpty(h)?"空":"非空"));
	  printf("请输入想要获取元素的位置:");
	  scanf("%d",&Pos);
	  getElem(h,Pos,&e);
	  printf("在%d位置上的元素是:%d\n",Pos,e);
	  printf("请输入要查找位置的元素:\n");
	  scanf("%d",&obj); 
	  printf("%d在单链表中的位置是:%d\n",obj,LocateElem(h,obj));
	  printf("请输入要插入的元素和位置:\n");
	  scanf("%d %d",&InsertElem,&InsertPos);
	  ListInsert(h,InsertPos,InsertElem);
	  printf("请输入操作后的单链表:\n");
	  DispList(h);
	  printf("请输入要删除元素的位置:");
	  scanf("%d",&DeletePos);
	  ListDelete(h,DeletePos,e);
	  printf("输出再次操作的单链表:\n");
	  DispList(h);
	  printf("销毁单链表\n");
	  Destroy(h);
	  return 0; 
 } 
  //主函数 

运行结果如下:
在这里插入图片描述
优化后在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值