数据结构与算法 第02部分:线性表

1:结点定义

typedef struct LNode {
	int data; //结点的数据域
	struct LNode *next; //结点的指针域
}LNode, *LinkList; //LinkList为指向结构体LNode的指针类型

2:构造一个新的结点

bool InitList_L(LinkList &LNew,int nData = 0)//构造一个新的结点
{
	LNew = new LNode;     //生成新结点
	if (nullptr == LNode) //生成结点失败
	{
		return false;  
	}  
	LNew->data = nData;
	LNew->next = nullptr;   //结点的指针域置空
	return true;
}

3:前插法创建n个元素的单链表(将新结点插入到头结点之后)

void CreateList_H(LinkList &LHead,int n)//前插法创建n个元素的单链表(将新结点插入到头结点之后)
{
    LinkList LNew; //定义一个指针变量
    InitList_L(LHead);//先建立一个带头结点的空链表
    int nData = 0;
    while(n--)//前插法创建单链表...
    {
        nData++;
        InitList_L(LNew,nData); //生成新结点LNew,值为n
        LNew->next = LHead->next;
        LHead->next = LNew; //将新结点LNew插入到头结点之后
    }
}

4:尾插法创建n个元素的单链表(将新结点插入到尾结点之后)

void CreateList_R(LinkList &LHead, int n)//尾插法创建n个元素的单链表(将新结点插入到尾结点之后)
{
    LinkList LNew, rTemp;
    InitList_L(LHead);//先建立一个带头结点的空链表
    rTemp = LHead; //尾指针r指向头结点
    int nData = 0;
    while(n--)//尾插法创建单链表...
    {
        nData++;
        InitList_L(LNew,nData);//生成新结点
        rTemp->next = LNew;//将新结点LNew插入尾结点*rTemp之后
        rTemp = LNew;//rTemp指向新的尾结点LNew
    }
}

5:单链表的取值(在带头结点的单链表LLink中查找第nIndex个元素,用nData记录L中第nIndex个数据元素的值)

//单链表的取值(在带头结点的单链表LLink中查找第nIndex个元素,用nData记录L中第nIndex个数据元素的值)
bool GetElem_L(LinkList LLink, int nIndex, int &nData)
{
    if (nIndex <= 0)//nIndex值不合法i<=0
    {
        return false;
    }

    LinkList p = LLink->next;//p指向第一个结点(去掉头结点)
    int j = 1; //j为计数器
    while (j < nIndex && nullptr != p) //顺链域向后扫描,直到p指向第i个元素或p为空
    {
        p = p->next; //p指向下一个结点
        j++; //计数器j相应加1
    }
    if (nullptr == p)//i值不合法i>n(扫到了末尾)
    {
        return false; 
    }		
    nData = p->data; //取第i个结点的数据域
    return true;
}

6:按值查找(在带头结点的单链表LLink中查找值为nData的元素)

//按值查找(在带头结点的单链表LLink中查找值为nData的元素)
bool LocateElem_L(LinkList LLink, int nData) 
{
    LinkList p = LLink->next;
    //顺链域向后扫描,直到p为空或p所指结点的数据域等于nData
    while (nullptr != p && p->data != nData)
    {
        p = p->next; //p指向下一个结点
    }	
    return (nullptr != p); //查找失败p为NULL
}

7:单链表的插入(在带头结点的单链表LLink中第nIndex个位置插入值为nData的新结点)

//单链表的插入(在带头结点的单链表LLink中第nIndex个位置插入值为nData的新结点)
bool ListInsert_L(LinkList &LLink, int nIndex, int nData)/
{
    if (nIndex < 1)//nIndex<1
    {
        return false;
    }
    LinkList p = LLink;
    int j = 0;
    while (nullptr != p && j < nIndex - 1) //查找第nIndex-1个结点,p指向该结点
    {
        p = p->next;
        j++;
    }
    if (nullptr == p)//i>n+1
    {
        return false;
    }
    LinkList LNew;
    InitList_L(LNew,nData); //生成新结点
    LNew->next = p->next; //将新结点的指针域指向结点ai
    p->next = LNew;       //将结点p的指针域指向结点s
    return true;
}

8:单链表的删除(在带头结点的单链表LLink中,删除第nIndex个位置)

//单链表的删除(在带头结点的单链表LLink中,删除第nIndex个位置)
bool ListDelete_L(LinkList &LLink, int nIndex) 
{
	if (nIndex < 1)//当nIndex<1时,删除位置不合理
	{
		return false;
	}
	LinkList p = LLink;
	int j = 0;
	while((nullptr != p->next)&&(j < nIndex -1)) //查找第i-1个结点,p指向该结点
	{
		p = p->next;
		j++;
	}

	if (nullptr == p->next)//当nIndex>n删除位置不合理
	{
		return false;
	}
	LinkList q = p->next;        //临时保存被删结点的地址以备释放空间
	p->next = q->next; //改变删除结点前驱结点的指针域
	delete q;        //释放被删除结点的空间
	return true;
}

9:单链表的输出

//单链表的输出
void Listprint_L(LinkList LLink) 
{
    LinkList p = LLink->next;
    while (nullptr != p)
    {
        cout<<p->data<<"\t";
		p = p->next;
    }
    cout<<endl;
}

10:链表合并

LinkList LALink, LBLink, LcLink;
CreateList_R(LALink);//创建链表非递减LALink
CreateList_R(LBLink);//创建非递减链表LBLink
InitList_L(LcLink);//创建空链表LcLink
//链表LALink和链表LBLink合并后放入LcLink中
void mergelinklist(LinkList LALink, LinkList LBLink, LinkList &LcLink)
{
    LinkList p = LALink->next; //p指向LALink的第一个元素
    LinkList q = LBLink->next; //q指向LBLink的第一个元素
    while(nullptr != p && nullptr != q)
    {
        if(p->data <= q->data)//把p指向的结点串起来
        {
            LcLink->next = p;
            LcLink = p;
            p = p->next;//p后移一个结点 
        }
        else             //把q指向的结点串起来
        {
            LcLink->next = q;
            LcLink = q;
            q = q->next;
        }
    }
    LcLink->next = p ? p : q;//相当于if(p) r->next=p; else r->next=q;
}
delete LALink, LBLink, LcLink;

11:中间结点

//中间结点
LinkList findmiddle(LinkList LLink)
{
    LinkList p = LLink; //p为快指针,初始时指向L
    LinkList q = LLink; //q为慢指针,初始时指向L
    while(nullptr != p && nullptr != p->next)
    {
        p = p->next->next;//p为快指针一次走两步;
        q = q->next; //q为慢指针一次走一步
    }
    return q;//返回中间结点指针
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员的资料库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值