单链表的实现(有详细注释)

#include <iostream.h>//iostream 是输入输出流,即cin\cout等

#define OK 1
#define ERROR 0

typedef int Status;//定义结构体,typedef是类型定义,Status是函数返回值类型
typedef int ElemType;//将整形int关键字重新命名为ElemType,ElemType代表所有可能的数据类型,这里为int型
typedef struct LNode//struct LNode是一个整体
{
     ElemType   data;       //数据域
     struct LNode  *next;   //指针域
}LNode,*LinkList;//LNode是别名,LinkList是指针别名,LinkList为指向结构体LNode的指针类型  

Status InitList_L(LinkList &L)//单链表的初始化:建立一个空的单链表,即创建一个头节点
{ 
   L=new LNode;//生成新节点作为头结点,用指针L指向头节点
   L->next=NULL;//将头节点的指针域置空
   return OK;
} 


//尾插法创建单链表:从一个空表开始,创建一个头结点,依次读取字符数组a中的元素,生成新节点,将新节点插入到当前链表的表尾上,直到结束为止
void CreateList_L(LinkList &L, int n)
{
	LinkList r,p;//r为尾指针,始终指向当前链表的的尾节点
	L=new LNode;//创建头节点
	L->next=NULL;//其next域置为空
	r=L;//r始终指向尾结点,开始时指向头节点 	                                //尾指针r指向头结点 
	for(int i=0;i<n;++i)
	{
		p=new LNode;//创建数据节点p      
        cin>>p->data;//输入元素值 
        p->next=NULL;
        r->next=p;//将p插入r之后
        r=p;//r指向新的尾结点 	                                  //r指向新的尾结点 
      } 
}

//定义Output
Status Output(LinkList L)
 { 
   int i=0;
   LinkList p;
   p=L->next; /* p指向第一个结点 */
   while(p) /* 没到表尾 */
   {
     i++;
	 cout<<"第"<<i<<"个节点的值为:"<<p->data<<"\n";
     p=p->next;
   }
   return OK;
 }


//获取线性表L中的某个数据元素的内容:在单链表中从头开始找到第i个节点,若存在第i个数据节点,则将其data值域赋给变量e
Status GetElem_L(LinkList L, int i, ElemType &e){ 
    LinkList p;//定义p 
	p=L->next;//p指向头结点
    int j=1; //初始化
     while(p&&j<i){	//向后扫描,直到p指向第i个元素或p为空 
       p=p->next; 
       ++j; 
     } 
     if(!p || j>i)//第i个元素不存在
		 return ERROR; 
     e=p->data; //取第i个元素 
     return OK; 
}

//按元素值查找:从单链表L中从头开始找第1个值域与e相等的节点,若存在,返回位置,若不存在,返回0
int LocateELem_L (LinkList L,ElemType e) {
 
   LinkList p;
   p=L->next;//p指向第一个节点
   int j=1;//初始化
  while(p &&p->data!=e)//寻找与e值域相等的节点  
        {p=p->next; 
         j++;}          		
  if(p)//存在 
	  return j; 
  else //不存在
	  return 0;
} 

//插入数据元素:先在单链表L中找到第i-1个节点p,若存在这样的节点,将值域为e的节点s插入到其后
Status ListInsert_L(LinkList &L,int i,ElemType e){ 
    LinkList p,s;
	p=L;
	int j=0; 
    while(p&&j<i-1)//寻找第i-1个节点
	{
		p=p->next;
	    ++j;
	} 
      if(!p||j>i-1)//i大于表长,或者i小于1,即未找到第i-1个节点
		  return ERROR;	
      s=new LNode;//生成新结点s 
      s->data=e;//将s的数据域置为e 
      s->next=p->next;//将节点s插入L中 
      p->next=s; 
      return OK; 
}//ListInsert_L 

//删除数据元素:先在单链表L中找到第i-1个节点p,若存在这样的节点,且也存在后继节点,则删除该后继节点
Status ListDelete_L(LinkList &L, int i, ElemType &e){
    LinkList p,q;
	p=L;
	int j=0; 
    while(p->next &&j<i-1){ //寻找第i-1个节点
        p=p->next;
		++j; 
    } 
    if(!(p->next)||j>i-1)
		return ERROR; //删除位置不合理 
    q=p->next;//q指向第i个节点                                        //临时保存被删结点的地址以备释放 
    p->next=q->next;//从单链表中删除q节点
    e=q->data; //保存删除结点的数据域 
    delete q;//释放删除结点的空间 
 return OK; 
}

int main()
{
	LinkList La;
	int n,a,b,i;
    ElemType e;
	if(InitList_L(La))
       cout<<"链表创建成功!\n";

    cout<<"请输入链表到达长度:";
	cin>>n;
    CreateList_L(La,n);

    cout<<"当前的链表为:\n";
	Output(La);
/*
	cout<<"请输入要查找的位置:";
	cin>>a;
    if(GetElem_L(La,a,e))
	{
       cout<<"查找成功\n";
	   cout<<"查找的值为:"<<e<<"\n";
	   }
	else
       cout<<"查找失败\n";
 
    cout<<"请输入要查找的值:";
	cin>>e;
    
    b=LocateELem_L(La,e);
    cout<<"\n要查找值所在的位置为:"<<b;
	cout<<"\n";
*/
	cout<<"\n输入插入所在的位置为:";
	cin>>i;
	cout<<"\n输入插入的元素值:";
	cin>>e;
    if(ListInsert_L(La,i,e))
	{
       cout<<"\n插入成功\n";
       Output(La);
	}
	else
       cout<<"\n插入失败\n";

    
	cout<<"\n输入删除节点的位置为:";
	cin>>i;
    if(ListDelete_L(La,i,e))
	{
       cout<<"\n删除成功\n";
       Output(La);
	}
	else
       cout<<"\n删除失败\n";
	

	return 0;
}

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值