数据结构--单链表基本操作

单链表的数据结构

typedef struct LNode
{
  ElemType data;
  struct LNode *next;
}LNode, *LinkList;

单链表的基本操作:

//创建单链表
LinkList CreateList();
//单链表的输出
Status ListTraverse(LinkList L);
//初始单链表
Status InitList(LinkList &L);
//销毁单链表
Status DestroyList(LinkList &L);
//将单链表重置为空表
Status ClearList(LinkList L);
//返回L中数据元素的个数
int ListLength(LinkList L);
//用e返回L中第i个元素的值
Status GetElem(LinkList L,int i,int &e);
//返回L中第一个与e满足compare()的数据元素的位序,如果不存在则返回0
int LocateElem(LinkList L,ElemType e,Status (*compare)(ElemType,ElemType));
//用pre_e返回L中cur_e(不是第一个)的前一个元素,否则操作失败,pre_e无定义
Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e);
//若cur_e是L的数据元素,且不是最后一个,则用next_e返回后继,否则操作失败,next_e无定义
Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e);
//在L的第i个位置之前插入新的元素e
Status ListInsert(LinkList L,int i,ElemType e);
//删除L的第i个位置的元素,并用e返回删除的数值
Status ListDelete(LinkList L,int i,ElemType &e);
//将所用在线性表Lb中但不在La中数据元素插入到La中
void Union(LinkList La,LinkList Lb);
//La Lb中元素按值非递减排列,归并La和Lb得到新的链表也是非递减排列
void MergeList(LinkList La,LinkList Lb,LinkList &Lc);

具体的实现

LinkList CreateList()
{
  int  len;//创建链表的长度
  LinkList L=(LinkList)malloc(sizeof(struct LNode));
  LinkList p,q=L;
  L->next=NULL;
  printf("请输入单链表的长度:");
  scanf("%d",&len);
  for (int i=1;i<=len;++i)
  {
    p=(LinkList)malloc(sizeof(struct LNode));
    printf("请输入第%d个元素:",i);
    scanf("%d",&p->data);
    q->next=p;
    q=p;
  }
  q->next=NULL; //注意这部操作,很容遗忘
  return L;
}


Status ListTraverse(LinkList L)
{
  LinkList p=L->next;
  while (p)
  {
    printf("%d  ",p->data);
    p=p->next;
  }
  return OK;
}


Status InitList(LinkList &L)
{
  L=(LinkList)malloc((sizeof(LNode)));
  if (!L)
  {
    exit(INFEASIBLE);
  }
  L->next=NULL;
  return OK;
}


Status DestroyList(LinkList &L)
{
  LinkList p;
  while (L)
  {
    p=L->next;
    free(L);
    L=p;
  }
  return OK;
}


Status ClearList(LinkList L)
{
  LinkList q,p=L->next;
  while (p)
  {
    q=p->next;
    free(p);
    p=q;
  }
  L->next=NULL;//注意这里的操作不能忘记 不然遍历出现问题
  return OK;
}


int ListLength(LinkList L)
{
  int len=0;
  LinkList p=L->next;
  while (p)
  {
    ++len;
    p=p->next;
  }
  return len;
}


Status GetElem(LinkList L,int i,int &e)
{
    LinkList p=L->next;
    int j=1;  //计数器的作用,通常p指针指到哪里便计数到哪里
    while (p&&j<i)
    {
      p=p->next;++j;
    }
    if(!p||j>i) return ERROR;
    e=p->data;
    return OK;


}


int LocateElem(LinkList L,ElemType e,Status (*compare)(ElemType,ElemType))
{
  int pos=0;
  LinkList p=L->next;
  while(p)
  {
    ++pos;
    if (compare(e,p->data))
    {
      return pos;
    }
    p=p->next;
  }
  return 0;
}


Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e)
{
  LinkList q,p=L->next;
  while (p->next)
  {
    q=p->next;
    if(cur_e==q->data)
    {
      pre_e=p->data;
      return OK;
    }
    p=q;
  }
  return ERROR;
}


Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e)
{
  LinkList q,p=L->next;
  while (p->next)
  {
    q=p->next;
    if(cur_e==p->data)
    {
      next_e=q->data;
      return OK;
    }
    p=q;
  }
  return ERROR;
}


Status ListInsert(LinkList L,int i,ElemType e)
{
  int j=0;
  LinkList q,p=L;  //注意删除和插入都是p=L 因为要指向操作的前一个元素
  while (p&&j<i-1)
  {
    ++j;
    p=p->next;
  }
  if(!p||j>i-1) return ERROR;
  q=(LinkList )malloc(sizeof(LNode));
  q->data=e;
  q->next=p->next;
  p->next=q;
  return OK;
}




Status ListDelete(LinkList L,int i,ElemType &e)
{
  LinkList q,p=L;
  int j=0;
  while (p->next&&j<i-1)
  {
    ++j;
    p=p->next;
  }
  if(!p->next||j>i-1) return ERROR;
  q=p->next;
  p->next=q->next;
  e=q->data;
  free(q);
  return OK;
}




void Union(LinkList La,LinkList Lb)
{
  int elem;
  int La_len=ListLength(La);
  int Lb_len=ListLength(Lb);
  for(int i=1;i<=Lb_len;++i)
  {
    GetElem(Lb,i,elem);
    if(!LocateElem(La,elem,compare)) ListInsert(La,++La_len,elem);
  }
}


void MergeList(LinkList La,LinkList Lb,LinkList &Lc)
{
  LinkList pa,pb,pc;
  pa=La->next;
  pb=Lb->next;
  pc=Lc=La;
  while (pa&&pb)
  {
    if(pa->data <= pb->data){pc->next=pa;pc=pa;pa=pa->next;}
    else {pc->next=pb;pc=pb;pb=pb->next;}
  }
  pc->next=pa?pa:pb;
  free(Lb);
}





                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值