2.3.1 单链表无头结点

 /* bo2-8.c 不带头结点的单链表(存储结构由c2-2.h定义)的部分基本操作(9个) */
 #define DestroyList ClearList /* DestroyList()和ClearList()的操作是一样的 */
 void InitList(LinkList *L)
 { /* 操作结果:构造一个空的线性表L */
   *L=NULL; /* 指针为空 */
 }

 void ClearList(LinkList *L)
 { /* 初始条件:线性表L已存在。操作结果:将L重置为空表 */
   LinkList p;
   while(*L) /* L不空 */
   {
     p=*L; /* p指向首元结点 */
     *L=(*L)->next; /* L指向第2个结点(新首元结点) */
     free(p); /* 释放首元结点 */
   }
 }

 Status ListEmpty(LinkList L)
 { /* 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
   if(L)
     return FALSE;
   else
     return TRUE;
 }

 int ListLength(LinkList L)
 { /* 初始条件:线性表L已存在。操作结果:返回L中数据元素个数 */
   int i=0;
   LinkList p=L;
   while(p) /* p指向结点(没到表尾) */
   {
     p=p->next; /* p指向下一个结点 */
     i++;
   }
   return i;
 }

 Status GetElem(LinkList L,int i,ElemType *e)
 { /* L为不带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */
   int j=1;
   LinkList p=L;
   if(i<1) /* i值不合法 */
     return ERROR;
   while(j<i&&p) /* 没到第i个元素,也没到表尾 */
   {
     j++;
     p=p->next;
   }
   if(j==i) /* 存在第i个元素 */
   {
     *e=p->data;
     return OK;
   }
   else
     return ERROR;
 }

 int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
 { /* 初始条件:线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) */
   /* 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。 */
   /*           若这样的数据元素不存在,则返回值为0 */
   int i=0;
   LinkList p=L;
   while(p)
   {
     i++;
     if(compare(p->data,e)) /* 找到这样的数据元素 */
       return i;
     p=p->next;
   }
   return 0;
 }

 Status ListInsert(LinkList *L,int i,ElemType e)
 { /* 在不带头结点的单链线性表L中第i个位置之前插入元素e */
   int j=1;
   LinkList p=*L,s;
   if(i<1) /* i值不合法 */
     return ERROR;
   s=(LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */
   s->data=e; /* 给s的data域赋值 */
   if(i==1) /* 插在表头 */
   {
     s->next=*L;
     *L=s; /* 改变L */
   }
   else
   { /* 插在表的其余处 */
     while(p&&j<i-1) /* 寻找第i-1个结点 */
     {
       p=p->next;
       j++;
     }
     if(!p) /* i大于表长+1 */
       return ERROR;
     s->next=p->next;
     p->next=s;
   }
   return OK;
 }

 Status ListDelete(LinkList *L,int i,ElemType *e)
 { /* 在不带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */
   int j=1;
   LinkList p=*L,q;
   if(i==1) /* 删除第1个结点 */
   {
     *L=p->next; /* L由第2个结点开始 */
     *e=p->data;
     free(p); /* 删除并释放第1个结点 */
   }
   else
   {
     while(p->next&&j<i-1) /* 寻找第i个结点,并令p指向其前驱 */
     {
       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;
 }

 void ListTraverse(LinkList L,void(*vi)(ElemType))
 { /* 初始条件:线性表L已存在。操作结果:依次对L的每个数据元素调用函数vi() */
   LinkList p=L;
   while(p)
   {
     vi(p->data);
     p=p->next;
   }
   printf("\n");
 }

 

 /* bo2-9.c 不带头结点的单链表(存储结构由c2-2.h定义)的部分基本操作(2个) */
 Status PriorElem(LinkList L,ElemType cur_e,ElemType *pre_e)
 { /* 初始条件:线性表L已存在 */
   /* 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,*/
   /*           返回OK;否则操作失败,pre_e无定义,返回INFEASIBLE */
   LinkList q,p=L; /* p指向第一个结点 */
   while(p->next) /* p所指结点有后继 */
   {
     q=p->next; /* q为p的后继 */
     if(q->data==cur_e)
     {
       *pre_e=p->data;
       return OK;
     }
     p=q; /* p向后移 */
   }
   return INFEASIBLE;
 }

 Status NextElem(LinkList L,ElemType cur_e,ElemType *next_e)
 { /* 初始条件:线性表L已存在 */
   /* 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,*/
   /*           返回OK;否则操作失败,next_e无定义,返回INFEASIBLE */
   LinkList p=L; /* p指向第一个结点 */
   while(p->next) /* p所指结点有后继 */
   {
     if(p->data==cur_e)
     {
       *next_e=p->next->data;
       return OK;
     }
     p=p->next;
   }
   return INFEASIBLE;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值