单链表上的基本操作

单链表上的基本操作

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;
}
posted @ 2020-04-01 16:57  稀有的猪  阅读(403)  评论(0编辑  收藏  举报