线性表得链式表示和实现

结点=元素+指针
数据域:存储数据元素信息的域。
特点:非随机存取。
空链表:只存在头结点。
基本算法
//int length;
//构造一个空的链表
Status InitList(LinkList &L)
{
 //int length;
 L=(LinkList)malloc(sizeof(LNode));
 if(!L)
 {
  return OVERFLOW_s;//存储分配失败
 }
 else
 {
  L->next=NULL;
  length = 0;
  return OK;
 }
}
//销毁链表
Status DestroyList (LinkList &L)
{
 free(L);
 L->next = NULL;
 return OK;
}
//清空链表
Status ClearList(LinkList &L)
{
 //int length;
 L->next = NULL;
 length = 0;
 return OK;
}
//空链表
Status ListEmpty(LinkList L)
{
 if (L->next == NULL)
 {
  return OK;
 }
 else
 {
  return FASLE;
 }
}
//创建链表
void CreateList(LinkList &L, int length)
{
 /*int i;
 LinkList p;
 L = (LinkList)malloc(sizeof(LNode));
 L->next = NULL;
 for (i = length; i >0; i--)
 {
  p = (LinkList)malloc(sizeof(LNode));
  cin >> p->data;
  p->next = L->next;
  L->next = p;
 }*/
 int i;
 LinkList p,q;
 L = (LinkList)malloc(sizeof(LNode));
 L->next = NULL;
 q = L;
 for (i = 1; i <=length; i++)
 {
  p = (LinkList)malloc(sizeof(LNode));
  cin >> p->data;
  q->next = p;
  q = p;
 }
 q->next = NULL;
}
//链表的长度
Status ListLength(LinkList L)
{
 LinkList p;
 int i=0;
 p = L;
 while (p->next)
 {
  p = p->next;
  i++;
 }
 return i;
}
//获取链表元素
Status GetElem(LinkList L, int i, ElemType &e)
{
 LinkList p;
 int j = 1;
 p = L->next;
 if (i<1 || i>length)
 {
  return ERROR;
 }
 while (p&&j < i)
 {
  p = p->next;
  j++;
 }
 if (!p||j>i)
 {
  return ERROR;
 }
 else
 {
  e = p->data;
  return OK;
 }
}
//置换链表的元素
Status PutElem(LinkList &L, int i, ElemType e)
{
 LinkList p;
 int j = 1;
 p = L->next;
 if (i<1 || i>length)
 {
  return ERROR;
 }
 while (p&&j < i)
 {
  p = p->next;
  j++;
 }
 if (!p||j>i)
 {
  return ERROR;
 }
 else
 {
  p->data = e;;
  return OK;
 }
}
//查找链表中的元素
Status LocateElem(LinkList L, ElemType e)
{
 LinkList p;
 int j = 0;
 p = L;
 while (p->next&&p->data != e)
 {
  p = p->next;
  j++;
 }
 if (p->data==e&&j<=length)
 {
  return j;
 }
 else
 {
  return ERROR;
 }
}
//查找链表的前驱
Status PriorElem(LinkList L, int cur_e, ElemType &pre_e)
{
 int i=1,j=1;
 LinkList p,q;
 //int j = LocateElem(L, cur_e);
 p = L->next;
 q = L;
 /*if (j == 0||j==1)
 {
  return ERROR;
 }
 else
 {
  while (p&&i < j-1)
  {
   p = p->next;
   i++;
  }
  pre_e = p->data;
  return OK;
 }*/
 while (p&&p->data != cur_e)
 {
  p = p->next;
  q = q->next;
  j++;
 }
 if ( j>length||j == 1)
 {
  return ERROR;
 }
 else
 {
  pre_e = q->data;
  return OK;
 }
}
//查找链表的后继
Status NextElem(LinkList L, int  cur_e, ElemType &next_e)
{
 int i = 1,j=0;
 LinkList p,q;
 //int j = LocateElem(L, cur_e);
 p = L;
 q = L->next;
 /*if (j == 0 || j == length)
 {
  return ERROR;
 }
 else
 {
  while (p&&i < j+1)
  {
   p = p->next;
   i++;
  }
  next_e = p->data;
  return OK;
 }*/
 while (p->next&&p->data != cur_e)
 {
  p = p->next;
  q = q->next;
  j++;
 }
 if (j >= length)
 {
  return ERROR;
 }
 else
 {
  next_e = q->data;
  return OK;
 }
}
//链表中插入元素
Status ListInsert(LinkList &L, int i, ElemType e)
{
 LinkList p,s;
 int j = 0;
 p = L;
 if (i<1 || i>length)
 {
  return ERROR;
 }
 while (p&&j < i-1)
 {
  p = p->next;
  j++;
 }
 if (!p || j>i - 1)
 {
  return ERROR;
 }
 else
 {
  s = (LinkList)malloc(sizeof(LNode));
  s->data = e;
  s->next = p->next;
  p ->next= s;
  length++;
  return OK;
 }
}
//链表中删除元素
Status ListDelete(LinkList &L, int i, ElemType &e)
{
 LinkList p, q;
 int j = 0;
 p = L;
 while (p->next&&j < i - 1)
 {
  p = p->next;
  j++;
 }
 if (!(p->next) || j>i - 1)
 {
  return ERROR;
 }
 else
 {
  q = p->next;
  p->next = q->next;
  e = q->data;
  free(q);
  length--;
  return OK;
 }
}
//遍历链表
void ListTraverse(LinkList L)
{
 int i=1;
 LinkList p;
 p = L;
 while (i < length)
 {
  p = p->next;
  i++;
  cout << p->data << "->";
 }
 cout << p->next->data;
 cout << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值