单链表的基本操作与实现

/*以下是个人的作业原版,难免会有错误,还请各位大神斧正*/
typedef int status;
typedef int Elemtype;
const int ok=1;
const int error=0;
const int overflow=-2;
const int TRUE=1;
const int FALSE=0;
 
typedef struct LNode{
	Elemtype       data;
	struct LNode   *next;
}LNode,*Linklist;                  //定义单链表的结点类型;

status initlist(Linklist &L)       //初始化单链表;
{ 
	//TODO1 生成单链表的头结点;
     L=(Linklist)malloc(sizeof(LNode));
     L->next=NULL;
    return ok;
}

status destroylist(Linklist &L)    //销毁单链表;
{	//TODO2
    Linklist p,q;
	p=L->next;
	while(p)
	{
		q=p->next;
		free(p);
	}
   free(L);
     return ok;
}

status listempty(Linklist &L)      //判断单链表是否为空;
{  //TODO3
	Linklist p=L->next;
	if(p==NULL)
	return TRUE;
	else 
	return FALSE;
    
}

int listlength( Linklist L)         //求单链表的长度;
{  //TODO 

   //p先指向第一个结点;
   Linklist p=L->next;
   //计数器清0;
   int count=0;
   //当p所指向的结点存在,计数器加1,同时指针下移;
   while(p)
   {
	   count++;
       p=p->next;
   }
   //while语句结束时,p移出单链表;
   return count; //返回单链表的长度;
   

}

void clearlist(Linklist &L)       //清空单链表;
{
  
	//TODO5
	Linklist p;
	while(L->next)
	{
		p=L->next;
		L->next=p->next;
		free(p);
	}
}

void printlist(Linklist L)        //输出单链表里的每一个结点;
{
	//TODO6
    //p指向头结点;
	Linklist p;
	p=L->next;
    //当p指向的结点存在,输出该结点,同时指针下移;
	while(p)
	{
		printf("%d\t",p->data);
		p=p->next;
	}

 
}

status getelem(Linklist L,int i,Elemtype &e)//取表中第i个元素放到变量e里;
{

	//TODO7
 
     //p首先指向第一个元素
   Linklist p;
   p=L->next;
   int j=0;
     //while语句结束时,如果第i个结点存在,p指向它;
   while(p->next&&j<i-1)
   {
	   p=p->next;
	   ++j;
   }
	 //否则p指向表尾;
 
     //表中不存在第i个结点或者表为空,返回出错信息;
   if(!(p->next)||j>i-1) return error;
   e=p->data;
   return ok;
}

status listinsert(Linklist &L,int i,Elemtype e)//向表中第i个元素的前面插入元素e;
{     //TODO8
	int j=0;
      //p首先指向头结点;
	Linklist p,s;
	p=L;
      //如果第i个结点存在,while语句结束时,p指向第i-1个结点;
	while(p&&j<i-1)
	{
		p=p->next;
		++j;
	}
      //否则p指向表尾;
     if(!p||j>i-1)
		 return error;
      //生成新的结点;
    s=(Linklist)malloc(sizeof(LNode));    
      //新的结点插入到p指向结点的后面(也就是插入到第i个结点的前面);
    s->data=e;
    s->next=p->next;
    p->next=s;
    return ok;
}

status listdelete(Linklist &L,int i,Elemtype &e)//删除表L中第i个元素,结果用e返回. 操作成功返回ok,失败时返回error
{
     //TODO9
	Linklist p=L,q;
	int j=0;
	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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beyond_LH

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值