带头结点的线性链表类型

 

带头结点的线性链表类型

带头结点的线性链表类型

"a.h"

#include
#include
#include
#define TRUE 1
#define  FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;

typedef struct LNode{
    ElemType data;
 struct LNode *next;
}LNode ,*Link,*Position;

typedef struct LinkList{
  Link head,tail;
  int len;
} LinkList;

"b.h"

#include"a.h"


Status MakeNode(Link*p,ElemType e);

void Free(Link *p);

Status InitList(LinkList *L);

Status ClearList(LinkList *L);

Status DestroyList(LinkList *L);

Status InFirst(LinkList *L,Link h,Link s);

Status DelFirst(LinkList *L,Link h,Link *s);

Status Append(LinkList *L,Link s);

Position PriorPosition(LinkList *L,Link s);

Status RemoveLast(LinkList *L,Link *s);

Status InsBefore(LinkList *L,Link *p,Link s);

Status InsAfter(LinkList *L,Link *p,Link s);

Status SetData(Link p,ElemType e);

Status GetData(Link p);

Status ListEmpty(LinkList L);

int ListLength(LinkList L);

Position GetHead(LinkList L);

Position GetLast (LinkList L);

Position NextPosition(Link p);

Status LocatePosition(LinkList L,int i,Link *s);

Position LocateElem(LinkList L,ElemType e,Status(*compare1)(ElemType,ElemType));

Status ListTraverse(LinkList L,void(*fun)(EelmType));

Status OrderInsert(LinkList ,ElemType e,int (*compare2)(ElemType,ElemType));

Status LocateElemTypePosition(LinkList L,ElemType e,Link *p,int (*compare1)(ElemType,ElemType));

"b.c"

#include"b.h"

 

Status MakeNode(Link *p,ElemType e)
{
 *p=(Link)malloc(sizeof(LNode));
 if(!(*p))
  return ERROR;
 (*p)->data=e;
 return OK;
}


void Free(Link *p)
{
    free(*p);
 (*p)=NULL;
 
}

Status InitList(LinkList *L)
{
     Link p;
  p=(Link)malloc(sizeof(LNode));
  if(p)
  {
     (*L).head=(*L).tail=p;
  p->next=NULL;
  (*L).len=0;
  return TRUE;
  }
  else
   return ERROR;
}

Status ClearList(LinkList *L)
{
 Link p,q;
    if((*L).head!=(*L).tail){
      p=(*L).head;
   while(p!=(*L).tail){
       q=p->next;
    Free(&p);
    p=q;
   }
   free(q);
   (*L).head=(*L).tail;
   (*L).len=0;
 }
 return OK;
}

Status DestroyList(LinkList *L)
{
      ClearList(L);
   Free(&(*L).head);
   (*L).tail=NULL;
   (*L).len=0;
   return OK;

}
Status InFirst(LinkList *L,Link h,Link s)
{
   s->next=h->next;
   h->next=s;
   if(h==(*L).tail)
       (*L).tail=h->next;
   (*L).len++;
   return OK;

}

Status DelFirst(LinkList *L,Link h,Link *s)
{
   (*s)=h->next;
     if(*s){
      h->next=(*s)->next;
    if(!(h->next))
    (*L).tail=h;
   (*L).len--;
   return OK;
   }
  return FALSE;
}

Status Append(LinkList *L,Link s)
{
 Link p=s;
 int i=0;
    (*L).tail->next=s;
 while(p->next){
    p=p->next;
    i++;
  }
 (*L).tail=p;
 (*L).len+=i;
 return OK;
    
}

Position PriorPosition(LinkList *L,Link s)
{
     Link p=(*L).head->next;
  if(s==p)
   return ERROR;
  while(p->next!=s){
     p=p->next;
  }
  return p;
}

int ListLength(LinkList L)
{
   return L.len;
}


Status RemoveLast(LinkList *L,Link *s)
{
   Link p=(*L).head;
   if(ListLength((*L))==0){
      *s=NULL;
   return FALSE;
   }
   *s=(*L).tail;
    printf("删除的最后一个节点是 %d\n",(*s)->data);
   while(p->next!=(*L).tail)
      p=p->next;
  
   p->next=NULL;
   (*L).tail=p;
   (*L).len--;
   return OK;
}

Status InsBefore(LinkList *L,Link *p,Link s)
{
     Link q=PriorPosition(L,(*p));
  if(!q){
   L->head->next=s;
   s->next=(*p);
  }
  q->next=s;
  s->next=(*p);
  (*L).len++;
  return OK;
}

Status InsAfter(LinkList *L,Link *p,Link s)
{
     if((*p)==(*L).tail){
      (*p)->next=s;
   s->next=NULL;
   (*L).tail=s;
  
         s->next=(*p)->next;  
   (*p)->next=s;
          return OK;
}

Status SetData(Link p,ElemType e)
{
   p->data=e;
   return OK;
}

ElemType GetData(Link p)
{
   return p->data;
}

Status ListEmpty(LinkList L)
{
   if(L.len)
    return FALSE;
   else
    return TRUE;
}

 

Position GetHead(LinkList L)
{
 return L.head;
}

Position GetLast (LinkList L)
{
   return L.tail;
}

Position NextPosition(Link p)
{
   return p->next;
}

Status LocatePosition(LinkList L,int i,Link *s)
{
  Link p=L.head;
     if(i<1||i>L.len)
   return ERROR;
      while(i--)
    p=p->next;
   *s=p;
   return OK;
     
}

Position LocateElem(LinkList L,ElemType e,Status(*compare1)(ElemType,ElemType))
{
     Link p=L.head;
  while(p&&!compare1(p->data,e))
   p=p->next;
  return p;
}

Status ListTraverse(LinkList L,void(*fun)(EelmType))
{
     Link p=L.head->next;
     while(p){
   
    fun(p->data);
        p=p->next;
  }
  printf("\n");
  return OK;
}

Status OrderInsert(LinkList L,ElemType e,int (*compare2)(ElemType,ElemType))   //非降序排序
{
   Link q,s;
      Link p=L.head->next;
   while(p&&compare2(e,p->data)>0){
         q=p;
      p=p->next;
   }
      s=(Link)malloc(sizeof(LNode));
   q->next=s;
   s->data=e;
   if(!p)
   L.tail=p;
   s->next=p;
   L.len++;
   return OK;
}

Status LocateElemTypePosition(LinkList L,ElemType e,Link *p,int (*compare2)(ElemType,ElemType))
{
      Link q;
      Link s=L.head;
   while(s&&compare2(s->data,e)<0){
         q=s;
      s=s->next;
   }
   if(!s&&compare2(s->data,e)>0){
        *p=q;
     return ERROR;
   }
   else{
     *p=s;
     return OK;
   }
}

"main.c"

#include"b.h"

Status compare1(ElemType e,ElemType f)
{
      if(e==f)
    return TRUE;
   else
    return FALSE;
}

int compare2(ElemType e,ElemType f)
{
      return (e-f);
}

void fun(ElemType e)
{
   printf(" %d ",e);
}

int main()
{
  int i;
  Link p,q;
     LinkList L;
  InitList(&L);
  printf("************************************************\n");
  for(i=0;i<10;i++){
     MakeNode(&p,i);
  InFirst(&L,L.tail,p);
  }
  ListTraverse(L,fun);

  printf("链表长度为:%d\n",ListLength(L));

  for(i=0;i<5;i++){
     DelFirst(&L,L.head,&p);
  printf("删除的第 %d 个节点为 %d\n",(i+1),p->data);
  }
     ListTraverse(L,fun);
    
  MakeNode(&q,10);
  q->next=NULL;
  for(i=11;i<15;i++){         //从后向前链接
          MakeNode(&p,i);
          p->next=q;
          q=p;
  }
  Append(&L,p);
  ListTraverse(L,fun);
      printf("链表长度为:%d\n",ListLength(L));

  RemoveLast(&L,&p);
  printf("*********");
  printf("删除的最后一个节点是 %d\n",p->data);
  ListTraverse(L,fun);

     LocatePosition(L,4,&p);
  printf("第四个节点为 %d \n",p->data);
   
  q=PriorPosition(&L,p);
  printf("第三个节点是 %d\n", q->data);
     ListTraverse(L,fun);
    
  MakeNode(&p,20);
  InsBefore(&L,&q,p);
     ListTraverse(L,fun);

  MakeNode(&p,30);
  InsAfter(&L,&q,p);
  ListTraverse(L,fun);
    
  SetData(q,25);
  ListTraverse(L,fun);
  printf("q的数据值为 %d\n",GetData(q));

     p=LocateElem(L,25,compare1);
     printf("p的值是 %d\n",p->data);

  for(i=10;i<20;i++)
        OrderInsert(L,i,compare2);
  ListTraverse(L,fun);

     
     LocateElemTypePosition(L,11,&p,compare2);
  printf("与11满足compare2的元素是 %d\n",p->data);
    
  if(ListEmpty(L))
   printf("表为空!!\n");
  else
   printf("表不为空!!\n");

  ClearList(&L);
      printf("链表长度为:%d\n",ListLength(L));


}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值