【数据结构】【算法】【c】单链表增删改查代码实现

本代码根据严蔚敏数据结构书上的代码进行修改而成。该代码符合以下要求:

  1. 空表删除、查询、求长度报错;
  2. 添加表首和表尾位置能否成功,其它添加位置能否成功;过小或过大的添加位置报错;
  3. 删除表首和表尾位置能否成功,其它删除位置能否成功;过小或过大的删除位置报错;
  4. 查找成功和查找失败是否均能正确显示;
//编写人:naruuu
//编写功能:线性表的链式表示(单链表)与实现

#include <stdio.h> //将stdio.h包含到本程序中

#define OK 1
#define ERROR -1


#define ElemType int
#define Status int

typedef struct node {
	ElemType data; //结点的数据域
	struct node *next;//结点的指针域
}LNode, *LinkList;

Status InitList(LinkList &L) { //算法2.6 单链表的初始化
	//构造一个空链表L
	L = new LNode; //生成新结点作为头结点,用头指针L指向头结点
	L->next=NULL;
	return OK;
}
Status LinkLength(LinkList L)//单链表长度计算
{
	int k=0;
	while(L->next!=NULL)
	{
		k++;
		L=L->next;
	}
	return k;
}

Status GetElem(LinkList L, int i, ElemType &e) {//算法2.7 单链表的取值
    LinkList p;
	int j;
	p=L->next; j=1;
	while(p&&j<i)
	{
	     p=p->next;
		 ++j;
	}
	if(!p||j>i) 
	{
		printf("error");
		e=0;
		return 0;
	}
	e=p->data;
	return OK;
}

Status LocateElem(LinkList L, ElemType e) {//算法2.8 单链表的按值查找
	LinkList p=L->next;
    int i=0;
	while(p&&p->data!=e)
	{
		p=p->next;
		++i;
	}
	if(i==LinkLength(L))
	{
		
		printf("the num don't exsit in the LinkList");
		return NULL;
	}
	else 
	{
		printf("the num's location in the LinkList is:");
		return i+1;
	}
}


Status ListInsert(LinkList &L, int i, ElemType e) { //算法2.9 单链表的插入
   LinkList s,p=L;
   int j=0;
   while(p && j<i-1){
       p=p->next;
	   ++j;
   }
   if(!p || j>i-1) 
   {
	   printf("error\n");
	   return ERROR;
   }
   s=new LNode; 
   s->data=e;
   s->next=p->next;
   p->next=s;
   return OK;
}

Status ListDelete(LinkList &L, int i,ElemType &e) { //算法2.10 单链表的删除
   LinkList q,p=L;int j=0;
   while(p->next && j<i-1)
   {
       p=p->next;
	   ++j;
   }
   if(!(p->next)||j>i-1) 
   {
	   printf("error");
	   e=0;
	   return ERROR;
   }
   q=p->next;
   p->next=q->next;
   e=q->data;
   delete q;
   return OK;
}

void main()
{
    LinkList L;
	ElemType e;
	ElemType length;
	int  tmp;
	InitList(L);//初始化L,顺序表在使用之前必须用Init初始化
	GetElem(L,1,e);printf("%d\n",e);
	length=LinkLength(L);printf("the length is:%d\n",length);//空表长度
	tmp=LocateElem(L,20);printf("%d\n",tmp);//空表 无该元素 报错 
	ListInsert(L,1,10);	ListInsert(L,2,20);ListInsert(L,3,30);//依次添加10,20,30
	ListInsert(L,0,10);//过小添加 报错
	length=LinkLength(L);printf("the length is :%d\n",length);//插入元素后 表的长度
	GetElem(L,1,e);printf("%d\n",e);
	GetElem(L,4,e);printf("%d\n",e);//表内没有这两个元素 报错
	GetElem(L,0,e);printf("%d\n",e);
    tmp=LocateElem(L,20);printf("%d\n",tmp);
	tmp=LocateElem(L,0);printf("%d\n",tmp);
	tmp=LocateElem(L,40);printf("%d\n",tmp);//没有该元素 报错


	
	ListDelete(L,1,e);printf("%d\n",e);
	ListDelete(L,2,e);printf("%d\n",e);
	ListDelete(L,1,e);printf("%d\n",e);
	ListDelete(L,1,e);printf("%d\n",e);
	ListDelete(L,4,e);printf("%d\n",e);
//没有该元素 会报错
}




/*
测试结果:


error0
the length is:0
the num don't exsit in the LinkList0
error
the length is :3
10
error0
error0
the num's location in the LinkList is:2
the num don't exsit in the LinkList0
the num don't exsit in the LinkList0
10
30
20
error0
error0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值