线性表得链式表示和实现

结点=元素+指针
数据域:存储数据元素信息的域。
特点:非随机存取。
空链表:只存在头结点。
基本算法
//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;
}
线性表链式表示是一种动态、非连续的存储方式,与顺序表的连续存储不同,它能高效地处理插入删除操作链式存储通过若干个结点形成链表,下面详细介绍几种常见链表的定义、表示基本操作。 ### 单链表 单链表是结点只有一个指针域的链表。结点是数据元素的存储映像,由数据域指针域两部分组成,链表则是由n个结点通过指针链组成的一个线性表 [^2]。 以下是单链表删除操作的代码示例: ```c Status ListDelete_L(LinkList &L, int i, ElemType &e) { // 在带头结点的单链线性表L中,删除第i个元素,由e返回其值 LinkList p,q; p = L; int j = 0; 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; } // ListDelete_L ``` 该代码的思路是先找到要删除结点的前一个结点,然后将前一个结点的指针指向要删除结点的下一个结点,最后释放要删除的结点 [^3]。 ### 双链表 双链表是结点有两个指针域的链表。以下是双向链表插入操作的代码示例: ```c int InsertList(LinkList l,int pos,int val){ LinkList p,s; int length,i = 0; length = ListLength(l); p = l; //p初始指向头结点 //判断pos值的合法性 if(pos < 1 || pos > length + 1){ return -1; } while(p != NULL && i < pos - 1){ i++; p = p->next; } //此时p为插入位置的前一个结点 //创建新结点 s = (LinkList) malloc(sizeof(Node)); if(s == NULL){ return -1; } s->data = val; //插入结点 s->next = p->next; if(p->next != NULL){ //若p不为尾结点 p->next->prior = s; } s->prior = p; p->next = s; return 1; //插入成功,返回1 } ``` 此代码实现了在双向链表指定位置插入新结点的功能,先判断插入位置的合法性,然后找到插入位置的前一个结点,创建新结点调整指针关系 [^4]。 ### 循环链表 循环链表是首尾相接的链表,其特点是从链表中任意一个结点出发都能遍历整个链表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值