链表结构的基本操作(整理)

///为了方便阅读,我直接把注释写在了程序里,如果发现我写的有问题,欢迎各位巨佬指导。

#include<bits/stdc++.h>
using namespace std;
#define MaxSize 50
typedef int ElemType;
typedef struct LNode       //声明单链表结点类型
{
    ElemType data;
    struct LNode *next;     //指向后继结点
}  LinkNode;
void CreateListF(LinkNode *&L,ElemType a[],int n)///头插法建立,数组a,n个数
{  LinkNode *s;
   L=new LinkNode;
   L->next=NULL;
    for (int i=0;i<n;i++)        //循环建立数据结点
  {  s=new LinkNode;
     s->data=a[i];        //创建数据结点s
     s->next=L->next;        //将s插在原开始结点之前,头结点之后
     L->next=s;
  }
}
void CreateListR(LinkNode *&L,ElemType a[],int n)///尾插法建立
{  LinkNode *s,*r;
   int i;
   L=new LinkNode;  //创建头结点
   r=L;
   for (i=0;i<n;i++)        //循环建立数据结点
   {    s=new LinkNode;
    s->data=a[i];        //创建数据结点s
    r->next=s;        //将s插入r之后
    r=s;
   }
   r->next=NULL;            //尾结点next域置为NULL
}
void InitList(LinkNode *&L)///初始化链表
 {
    L=new LinkNode;    //创建头结点
    L->next=NULL;
 }
void DestroyList(LinkNode *&L)///摧毁列表L(释放内存)
{
   LinkNode *pre=L, *p=L->next;
      while (p!=NULL)    //扫描单链表L
   {  free(pre);        //释放pre结点
      pre=p;        //pre、p同步后移一个结点
      p=pre->next;
   }
   free(pre);         //循环结束时,p为NULL,pre指向尾结点,释放它
}
bool ListEmpty(LinkNode *L)///判断链表是否为空
{
    return(L->next==NULL);
}
int ListLength(LinkNode *L)///返回链表长度
{
    int n=0;
    LinkNode *p=L;
   while (p->next!=NULL)
   {    n++;
    p=p->next;
   }
   return(n);    //循环结束,p指向尾结点,其序号n为结点个数
}
void DispList(LinkNode *L)///输出链表
{
   LinkNode *p=L->next;        //p指向开始结点
   while (p!=NULL)        //p不为NULL,输出p结点的data域
   {  cout<<p->data<<"   ";
      p=p->next;            //p移向下一个结点
   }
   cout<<endl;
}
bool GetElem(LinkNode *L,int i,ElemType &e)///找到第i个元素,返回值到e上面
{
   int j=0;
   LinkNode *p=L;     //p指向头结点,j置为0(即头结点的序号为0)

   while (j<i && p!=NULL)
   {    j++;
    p=p->next;
   }
   if (p==NULL)        //不存在第i个数据结点,返回false
      return false;
   else            //存在第i个数据结点,返回true
   {  e=p->data;
      return true;
   }
}
int LocateElem(LinkNode *L,ElemType e)///返回元素值为e的元素的位置
{
   int i=1;
   LinkNode *p=L->next;        //p指向开始结点,i置为1

   while (p!=NULL && p->data!=e)
   {  p=p->next;          //查找data值为e的结点,其序号为i
      i++;
   }
      if (p==NULL)        //不存在元素值为e的结点,返回0
      return(0);
   else            //存在元素值为e的结点,返回其逻辑序号i
      return(i);
}
bool ListInsert(LinkNode *&L,int i,ElemType e)///插入函数
{  int j=0;
   LinkNode *p=L,*s;              //p指向头结点,j置为0

   while (j<i-1 && p!=NULL)
   {    j++;
    p=p->next;
   }
   if (p==NULL)    //未找到第i-1个结点,返回false
       return false;
   else            //找到第i-1个结点p,插入新结点并返回true
   {
    s=(LinkNode *)malloc(sizeof(LinkNode));
    s->data=e;        //创建新结点s,其data域置为e
    s->next=p->next;    //将s插入到p之后
    p->next=s;
    return true;
   }
}
bool ListDelete(LinkNode *&L,int i,ElemType &e)///删除列表中的第i个位置的数
{  int j=0;
   LinkNode *p=L,*q;        //p指向头结点,j置为0

   while (j<i-1 && p!=NULL)    //查找第i-1个结点
   {    j++;
    p=p->next;
   }
   if (p==NULL)            //未找到第i-1个结点,返回false
    return false;
   else                //找到第i-1个结点p
   {  q=p->next;            //q指向第i个结点
      if (q==NULL)        //若不存在第i个结点,返回false
     return false;
      e=q->data;
      p->next=q->next;        //从单链表中删除q结点
      free(q);            //释放q结点
      return true;        //返回true表示成功删除第i个结点
   }
}

int main()
{
    LinkNode *L;
    InitList(L);
    int n;//总共n个数
    cin>>n;
    ElemType a[MaxSize];
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    CreateListR(L,a,n);
    DispList(L);
    DestroyList(L);
    CreateListF(L,a,n);
    DispList(L);
    ///头插和尾插可以改变输出的顺序,在实际的操作的时候会有很大的用处。
    DestroyList(L);

    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值