• 单链表基本操作的实现


    (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;    
    
  • 相关阅读:
    LeetCode OJ 112. Path Sum
    LeetCode OJ 226. Invert Binary Tree
    LeetCode OJ 100. Same Tree
    LeetCode OJ 104. Maximum Depth of Binary Tree
    LeetCode OJ 111. Minimum Depth of Binary Tree
    LeetCode OJ 110. Balanced Binary Tree
    apache-jmeter-3.1的简单压力测试使用方法(下载和安装)
    JMeter入门教程
    CentOS6(CentOS7)设置静态IP 并且 能够上网
    分享好文:分享我在阿里8年,是如何一步一步走向架构师的
  • 原文地址:https://www.cnblogs.com/longzu/p/5257193.html
Copyright © 2020-2023  润新知