C++|单链表的实现源代码

#include <iostream>
using namespace std;
 
typedef struct LNode
{
       char data;
       struct LNode * next;
}LNode,* listLink;//此处声明了一个结构体类型和一个结构体类型的指针
 
/*单链表的初始化*/
void initList_L(listLink &L)
{
       L=new LNode;
       L->next=NULL;
}
 
/*清空表*/
void clearList_L(listLink &L)
{
       LNode *p,*q;
 
       p=L->next;
       L->next=NULL;//这里应该注意:L->next在等号左边和右边的含义是不一样的,在右边表示将下一个结点的地址
                    //赋值给变量,在左边表示L这个结点的地址域,是被赋值的对象。
 
 
       while (p)
       {
              q=p;
              p=p->next;
              delete q;//这里应该这样想:p和q都是指针,是指针在动,他们指向链表,而链表并没有动。
       }
}
 
/*求表长*/
int listLength_L(listLink &L)
{
       LNode *p;
       int length;
       p=L;
       length=0;
 
       while(p->next)
       {
              length++;
              p=p->next;
       }//始终遵循上面注释中说的:p和q都是指针,是指针在动,他们指向链表,而链表并没有动,这样理解就会容易很多。
 
       return length;
}
 
 
/*取第i个结点的元素值*/
char getElem_L(listLink &L,int i)
{
       LNode *p;
       int count;
 
       p=L->next;
       while(p&&count<i)
       {
              p=p->next;
              count++;
       }
       if(!p||count>i)
              cout<<"Position Error!";
       else
              return p->data;
}
 
/*确定表中某结点的地址*/
LNode *locateElem_L(listLink &L,char x)
{
       LNode *p;
       p=L->next ;
       while(p&&p->data!=x)
              p=p->next;
       if(!p)
              return NULL;
       else
              return p;
}
 
 
/*插入元素*/
void insertElem_L(listLink &L,int i,char x)
{
       LNode *p;
       LNode *s;
       int count;
 
       p=L->next;
       count=1;
 
       while(p&&count<i-1)
       {
              p=p->next;
              count++;
       }//寻找第i-1个结点,使p指向第i-1个结点。
 
       if(!p||count>i-1)
       {
              cout<<"Poision Error!";
       }
 
       else
       {
              s=new LNode;
              s->next=p->next;
              p->next=s;//注意这里赋值的顺序千万不能变,即不能这样:p->next=s; s->next=p->next;
                        //若是这样的话,就等于是先改变了p->next的值,也就不能把p的前继赋值给s了!!!
              s->data=x;
       }
}
 
/*删除表中的元素,并返回该元素的值*/
void deleteElem_L(listLink &L,int i)
{
       LNode *p,*q;
       int count;
 
       p=L->next;
       count=1;
 
       while((p->next)&&count<i-1)
       {
              p=p->next;
              count++;
       }
       if(!(p->next)||count>i-1)
              cout<<"Poision Error";
       else
       {
              q=p->next;
              p->next=q->next;
              delete q;//这里的释放就是把这个指针给销毁了,就是没有这个指针了,这也就是为什么要多一个指针的缘故。
       }
}
 
/*用正序插入法创建一个单链表*/
void creatList_L_1(listLink &L,int n)
{
       initList_L(L);
 
       LNode *p,*q;
       p=L;
 
       for(int i=0;i<n;i++)
       {
              q=new LNode;
 
              cin>>q->data;
              q->next=NULL;
 
              p->next=q;
              p=q;
 
       }
}//就是在表的尾端不断接上元素。
 
 
/*用逆序插入法创建一个单链表*/
void creatList_L_2(listLink &L,int n)
{
       initList_L(L);
 
       LNode *p;
       for(int i=0;i<n;i++)
       {
              p=new LNode;
 
              cin>>p->data;
              p->next=L->next;
              L->next=p;//不断地在L和L的前继之间插入新的元素。
       }
}//逆序法就是第一个输入的元素是单链表的最后一个元素,既是从链表的最后一个元素输入。
 
void outputList_L(listLink &L,int n)
{
       LNode *p;
       p=L->next;
 
       for(int i=0;i<n;i++)
       {
              cout<<p->data<<" ";
              p=p->next;
       }
       cout<<endl;
}//依次输出链表中的元素
 
void main()
{
       listLink L;
       //creatList_L_2(L,10);
       //outputList_L(L,10);
 
       creatList_L_1(L,10);//创建一个单链表
       //outputList_L(L,10);
 
       insertElem_L(L,2,'a');//插入
       outputList_L(L,listLength_L(L));
 
       deleteElem_L(L,11);//删除
       outputList_L(L,listLength_L(L));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值