数据结构-线性表-单链表

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-01 03:58:32

不带头结点的单链表(链式存储)
不要求逻辑上相邻的两个数据元素逻辑上也相邻,他们是通过"链",建立起数据元素之间的逻辑关系。因此对线性表的插入、删除不需要移动数据元素,只需要修改"链"
在这里插入图片描述
在这里插入图片描述

例如:画出26个字母的链式存储结构
逻辑结构:(a,b,c,…,x,y,z)
链式存储结构:
在这里插入图片描述

结点由两个域组成:
数据域:存储元素数值数据
指针域:存储直接后继结点的存储位置
在这里插入图片描述

与链式存储有关的术语

  1. 结点:数据元素的存储映像。由数值域和指针域两部分组成。
  2. 链表:n个结点由链指针组成一个链表。他是线性表的链式存储映像,称为线性表的链式存储结构。
  3. 单链表:结点只有一个指针域的链表。
  4. 双链表:有两个指针域的链表。
  5. 循环链表:首尾相接的链表。
  6. 头指针、首元结点
    头指针:指向链表中第一个结点的指针。
    首元结点:链表中存储第一个数据元素a1的结点。
    在这里插入图片描述

空表
在这里插入图片描述
非空表
在这里插入图片描述
单链表是由表头唯一确定,因此单链表可以用头指针的名字来命名。若头指针是head,则把链表称之为表head。

  • 建立一个空的单链表
node *init()
{
	return NULL;
}
  • 遍历操作
    在这里插入图片描述
    工作指针后移,从首结点出发,通过工作指针的反复后移而将整个单链表"审视"一次的方法。
输出单链表中各个结点的值
void display(linklist head)
{
	linklist p;
	p=head;
	if(p==NULL)
		printf("单链表是空表\n");
	else{
		printf("单链表各个结点的值为:\n");
		while(P){
				printf("%5d",p->info);
				p=p->next;
				}
		}
}
  • 查找第i个元素

  1. 工作指针P初始化;累加器count初始化;
  2. 重复执行(工作指针P后移,count++),直到P为空或者count==1;
  3. 返回P指针
按序号查找第i个结点

linklist findKth(linklist head,int i)
{
	int j=1;
	linklist p=head;
	while(p!=NULL&&j<i)
	{
		p=p->next;
		j++;
	}
	
	return p;	//找到第i个,返回第i个结点指针。如果没有找到,返回空。
  • 查找值为X的结点

在这里插入图片描述

  1. 工作指针P初始化;
  2. 重复执行(工作指针P后移),直到P为空或p->info==x;
  3. 返回p指针;
按值查找值为x的结点
linklist find(linklist head,datatype x)
{
	linklist p=head;
	while(p!=NULL&&p->info!=x)
	{
		p=p->next;
	}
	return p;	//如果找到x所在结点,p!=null,如果找不到,直接返回p即可。
  • 插入

操作接口:node *insert(node *head,datatype x,int i)
在这里插入图片描述
算法描述:

p=(node*)malloc(sizeof(node));		//分配空间
p->info=x;							//设置新结点
p->next=q->next;
q->next=p;
  • 表头插入

操作接口:node *insert(node *head,datatype x,int i)
在这里插入图片描述
算法描述:

p=(node*)malloc(sizeof(node));		//分配空间
p->info=x;							//设置新结点
p->next=head;
head=p;
  • 表尾插入
    操作接口:node *insert(node *head,datatype x,int i)

在这里插入图片描述
算法描述:

p=(node*)malloc(sizeof(node));		//分配空间
p->info=x;							//设置新结点
p->next=NULL;
q->next=p;
  • 删除
    操作接口: node *dele(node *head,int i)
    在这里插入图片描述
    算法描述:
p=pre->next;
pre->next=p->next;
free(p);
  • 删除表头
    操作接口:linklist deleOne(linklist head,int i);
    在这里插入图片描述
    算法描述:
p=head;
head=p->next;
free p;
  • 删除表尾
    操作接口:linklist deleOne(linklist head,int i);

    算法描述:
p=pre->next;
pre->next=NULL;
free (p);
  • 删除X结点
    操作接口:linklist deleTwo(linklist head,datatype x);在这里插入图片描述
    算法描述:
p=pre->p->next;
free (p);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!