zoukankan      html  css  js  c++  java
  • 单链表基本操作的实现

    (1)头指针:是指向链表中第一个结点的指针。若链表设有头结点,则头指针所指结点为线性表的头结点;若链表不设头结点,则头指针所指结点为该线性表的首元结点。
    (2)头结点:是在首元结点之前附设的一个结点,其指针域指向首元结点。头结点的数据域可以不存储任何信息,也可存储与数据元素类型相同的其他附加信息。例如,当数据元素为整数型时,头结点的数据域中可存放该线性表的长度。
    (3)首元结点:指链表中存储第一个数据元素的结点。

    #include <iostream>
    using namespace std;
    
    /*----------单链表的存储结构----------*/
    typedef struct LNode
    {
    	int data;	//结点的数据域
    	LNode *next;	//结点的指针域
    }*LinkList;		//LinkList为指向结构体LNode的指针类型
    
    LNode *p,*s,*q;
    
    void CreateList_H(LinkList &L,int n)	//前插法创建单链表(逆序)
    {
    	L=new LNode;	//生成新结点作为头结点,用头指针L指向头结点
    	L->next=NULL;	//先建立一个带头结点的空链表
    	for(int i=0;i<n;i++)
    	{
    		p=new LNode;	//生成新结点*p
    		cin>>p->data;	//输入元素值赋给新结点*p的数据域
    		p->next=L->next;	
    		L->next=p;	//将新结点*p插入到头结点之后
    	}
    }
    
    LNode *LocateElem(LinkList L,int e)		//查找值为e的元素
    {
    	p=L->next;	//初始化,p指向首元结点
    	while(p&&p->data!=e)	//顺链域向后扫描,直到p为空或p所指结点的数据域等于e
    		p=p->next;	//p指向下一个结点
    	return p;	//查找成功返回值为e的结点地址p,查找失败p为NULL
    }
    
    int GetElem(LinkList L,int i,int &e)	//根据序号i获取元素的值,用e返回单链表L中第i个结点的数据域
    {
    	p=L->next;	//初始化,p指向首元结点
    	int j=1;	//计数器j初值赋为1
    	while(p&&j<i)	//顺链域向后扫描,直到p为空或p指向第i个元素
    	{
    		p=p->next;	//p指向下一个结点
    		++j;		
    	}
    	if(!p||j>i)	return 1;	//i值不合法i>n或i<=0
    	e=p->data;	//取第i个结点的数据域
    	return 0;
    }
    
    int main()
    {
    	LinkList L;
    	int n=5,e;
    	CreateList_H(L,n);	//创建
    	if(LocateElem(L,30))	//查找
    		cout<<p->data<<" is the number we need!"<<endl;
    	if(!GetElem(L,2,e))	//取值
    		cout<<e<<endl;
    	return 0;
    }
    

    -----------------------------------------单链表的插入---------------------------------------------------

    int ListInsert(LinkList &L,int i,int e)	//在带头结点的单链表L中第i个位置插入值为e的新结点
    {
    	p=L;
    	int j=0;
    	while(p&&(j<i-1))	//查找第i-1个结点,p指向该结点
    	{
    		p=p->next;
    		++j;
    	}
    	if(!p||j>i-1) return 1;	//i>n+1或者i<1
    	s=new LNode;	//生成新结点*s
    	cin>>e;	
    	s->data=e;	//将结点*s的数据域置为e	
    	s->next=p->next;	//将结点*s的指针域指向第i个结点
    	p->next=s;	//将结点*p的指针域指向结点*s
    	return 0;
    }
    
    	if(!ListInsert(L,1,e))
    		cout<<e<<endl;
    	if(!GetElem(L,2,e))	
    		cout<<e<<endl;
    

    -----------------------------------------单链表的删除---------------------------------------------------

    int ListDelete(LinkList &L,int i)	//在带头结点的单链表L中,删除第i个元素
    {
    	p=L;
    	int j=0;
    	while((p->next)&&(j<i-1))	//查找第i-1个结点,p指向该结点
    	{
    		p=p->next;
    		++j;
    	}
    	if(!(p->next)||(j<i-1))	return 1;	//当i>n或i<1时,删除位置不合理
    	q=p->next;	//临时保存被删结点的地址以备释放
    	p->next=q->next;	//改变删除结点前驱结点的指针域
    	delete q;	//释放删除结点的空间
    	return 0;
    }
    
    if(!ListDelete(L,1))
    		cout<<e<<endl;
    if(!GetElem(L,2,e))	
    		cout<<e<<endl;    
    
  • 相关阅读:
    装饰器的应用
    绑定路由关系
    基本使用
    numpy多项式拟合
    pandas空值处理与插值
    索引
    事务
    子查询
    视图
    自关联
  • 原文地址:https://www.cnblogs.com/longzu/p/5257193.html
Copyright © 2011-2022 走看看