• 单链表上的基本操作


    单链表上的基本操作

    1.头插法建立单链表

    • T(n) = O(n)
    • 如果没有设立头结点,则每次插入新节点后,将结点的地址赋值给L
    • 生成单链表中数据元素的顺序与插入顺序相反。
    LinkList list_HeadInsert(LinkList &L, int n)
    {
    	LNode *p; int x;
    	L = (LinkList)malloc(sizeof(LNode));	//创建头结点
    	L -> next = NULL;	
    	for (int i = 0; i < n; i ++)
    	{
    		p = (LNode *)malloc(sizeof(LNode));	//生成新节点
    		scanf("%d", &x);
    		p -> data = x;
    		p -> next = L -> next;
    		L -> next = p;
    	}
    	return L;
    }
    

    2.尾插法建立单链表

    • T(n) = O(n)
    • 增加一个 尾指针r
    LinkList list_TailInsert(LinkList &L, int n)
    {
    	LNode *p, *r; int x;
    	L = (LinkList)malloc(sizeof(LNode));
    	L -> next = NULL;
    	r = L;
    	for (int i =  0; i < n; i ++ )
    	{
    		p = (LNode *)malloc(sizeof(LNode));
    		scanf("%d", &x);
    		p -> data = x;
    		r -> next = p;
    		r = p;
    	}
    	r -> next = NULL;	//尾结点指针置空
    	return L;
    }
    

    3.按序号查找结点值

    • 查找第i个结点的值,如果找到,将其保存到e中。
    • T(n) = O(n)
    bool GetElem(LinkList L, int i, ElemType &e);
    {
    	int j = 1;
    	LNode *p = L -> next;	//p指向首元结点
    	while(p && j < i)
    	{
    		p = p -> next;
    		j ++;
    	}
    	if (!p || j > i)	//p为空即i > n 或 i <= 0
    		return false;
    	e = p -> data;
    	return true;
    }
    

    4.按值查找结点

    • T(n) = O(n)
    LNode *LocateElem(LinkList L, ElemType e)
    {
    	LNode *p = L -> next;	//p指向首元结点
    	while (p && p -> data != e)
    	{
    	    p = p -> next;
    	}
    	return p;	//查找成功返回结点e的地址p,查找失败返回NULL
    }
    

    5.插入

    方法:

    • 图示:

    • 合法的插入位置:1 <= i <= n +1

    • T(n) = O(n)

    bool LisTInsert(LinKList &L, int i, int e)
    {
    	LNode *p = L, *s; int j = 0;
    	while (p && j < i - 1)
    	{
    	    p = p -> next;
    	    j ++;
    	}
    	if (!p || j > i - 1)	//p为空即 i > n + 1 或 i < 1;
    	s = (LNode *)malloc(sizeof(LNode));
    	s -> data = e;
    	s -> next = p -> next;
    	p -> next = s;
        return true;
    }
    

    拓展:

    • 将插入结点*s放到插入位置*p之后,然后交换*s*p的值。
    s -> next = p -> next;
    p -> next = s;
    temp = p -> data;
    p -> data = s -> data;
    s -> data = temp;
    

    6.删除

    方法:

    • 图示:
    bool ListDelete(LinKList &L, int i)
    {	
    	LNode *p = L, *q; int j= 0;
    	while((p -> next) && (j < i - 1))	//p -> next:p的后继结点可能不存在
    	{	
    		p = p -> next;
    		j ++;
    	}
            if (!(p -> next)||(j > i -1))
                return false;
    	q = p -> next;	//临时存储被删除结点的地址
    	p -> next = q -> next;
    	free(q);	//释放删除结点的空间
    	return true;
    }	
    

    拓展

    • 将待删除结点的后继结点的值赋予其自身,之后删除后继结点。
    q = p -> next;
    p -> data = q -> data;
    p -> next = q -> next;
    free(q);
    

    7.求表长

    int ListLenth(LinkList L)
    {	
    	LNode *p = L;
    	int length = 0;
    	while (!p)
    	{
    		p = p -> next;
    		length ++;
    	}
    	return length;
    }
    
  • 相关阅读:
    Cookie的作用范围、设置、创建、获取的方法
    2020寒假总结14
    MyBatis中foreach传入参数为数组
    Springmvc接收数组参数
    寒假每日总结十
    2020寒假每日总结
    2020寒假总结八
    2020寒假每日总结七
    2020寒假每日总结四
    2020寒假总结三
  • 原文地址:https://www.cnblogs.com/adios/p/12613735.html
Copyright © 2020-2023  润新知