2.3 线性表的链式表示

这篇具有很好参考价值的文章主要介绍了2.3 线性表的链式表示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

知识总览

2.3 线性表的链式表示

2.3.1 单链表的定义

知识总览

2.3 线性表的链式表示

单链表定义
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct LNode{
	int data;
	struct LNode *next;
};
int main(){	
	struct LNode *p=(struct LNode*)malloc(sizeof(struct LNode));
    return 0;
}
typedef重命名

typedef struct LNode{
  int data;
  struct LNode *next;
}LNode,*LinkList;

等同于

struct LNode{
    int data;
    struct LNode *next;
};
typedef struct LNode LNode;
typedef struct LNode *LinkList;

 

头插法建立单链表

头插法
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct LNode{
  int data;
  struct LNode *next;
}LNode,*LinkList;
LinkList List_HeadInsert(LinkList &L){
	LNode *s;
	int x;
	L=(LinkList)malloc(sizeof(LNode));  //创建头节点 
	L->next=NULL;                  //初始为空链表 
	scanf("%d",&x);                   //输入节点的值 
	while(x!=9999){                   //输出9999表示结束 
		s=(LNode*)malloc(sizeof(LNode));  //创建新节点 
		s->data=x;
		s->next=L->next;
		L->next=s;                  //将新节点插入表中,L为头指针 
		scanf("%d",&x);
	}
	return L;
}
int main(){
	LinkList L;
	List_HeadInsert(L);
}

强调这是一个单链表      ————使用LinkList

强调这是一个节点         ————使用LNode*

 

不带头节点的单链表
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct LNode{
  int data;
  struct LNode *next;
}LNode,*LinkList;
//初始化一个空的单链表 
bool InitList(LinkList &L){
	L=NULL;    //空表,//防止脏数据 
	return true;
} 
//判断单链表是否为空 
bool Empty(LinkList L){
	return (L==NULL);
} 
int main(){
	LinkList L; //声明一个指向单链表的指针 //此处并没有创建一个节点 
	InitList(L);
	Empty(L); 
}
带头结点的单链表
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct LNode{
  int data;
  struct LNode *next;
}LNode,*LinkList;
//初始化一个单链表 (带头结点)
bool InitList(LinkList &L){
    L=(LNode*)malloc(sizeof(LNode));
	if(L==NULL)
	    return false;
    L->next=NULL; 
	return true;
} 
//判断单链表是否为空 (带头结点)
bool Empty(LinkList L){
    if(L->next==NULL)
	   return  true;
	else
	   return false;
} 
int main(){
	LinkList L; //声明一个指向单链表的指针 
	InitList(L);
	Empty(L); 
}
 
总结
2.3 线性表的链式表示
 
 
 
2.3.2.1
知识总览
2.3 线性表的链式表示
 
 
 
按位序插入
 
按位序插入(带头结点)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct LNode{
  int data;
  struct LNode *next;
}LNode,*LinkList;
//初始化一个单链表 (带头结点)
bool InitList(LinkList &L){
    L=(LNode*)malloc(sizeof(LNode));
	if(L==NULL)
	    return false;
    L->next=NULL; 
	return true;
} 
//判断单链表是否为空 (带头结点)
bool Empty(LinkList L){
    if(L->next==NULL)
	   return  true;
	else
	   return false;
} 
//在第i个位置插入元素e(带头结点) 
bool ListInsert(LinkList &L,int i,int e){
	if(i<1)
	    return false;
	LNode *p;  //指针p指向当前扫描到的结点
	int j=0;   //当前p指向的是第几个结点
	p=L;     //L指向头结点,头结点是第0个结点(不存数据)
	while(p!=NULL&&j<i-1){ //循环找到第i-1 个结点 //找位置 
		p=p->next;
		j++;
	}
	if(p==NULL)   //i值不合法 
	   return false;
	LNode *s=(LNode*)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;   //将结点s连到p之后 
	return true; //插入成功 
}
int main(){
	LinkList L; //声明一个指向单链表的指针 
	InitList(L);
	Empty(L); 
	ListInsert(L,1,9);
}
 
 
按位序插入(不带头结点)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct LNode{
  int data;
  struct LNode *next;
}LNode,*LinkList;
//初始化一个空的单链表 
bool InitList(LinkList &L){
	L=NULL;    //空表,//防止脏数据 
	return true;
} 
//判断单链表是否为空 
bool Empty(LinkList L){
	return (L==NULL);
} 
bool ListInsert(LinkList &L,int i,int e){
	if(i<1)
	    return false;
	if(i==1){   //插入第1个结点的操作与其他操作不同 
		LNode *s=(LNode*)malloc(sizeof(LNode));
		s->data=e;
	    s->next=L;
	    L=s;      //头指针指向新结点 
	    return true;
	} 
	LNode *p;  //指针p指向当前扫描到的结点
	int j=1;   //当前p指向的是第几个结点
	p=L;     //p指向第1个结点(注意:不是头节点) 
	while(p!=NULL&&j<i-1){ //循环找到第i-1 个结点 //找位置 
		p=p->next;
		j++;
	}
	if(p==NULL)   //i值不合法 
	   return false;
	LNode *s=(LNode*)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;   
	return true; //插入成功 
}
int main(){
	LinkList L; //声明一个指向单链表的指针 
	InitList(L);
	Empty(L); 
	ListInsert(L,1,9);
}
 
 
 
指定结点的后插操作
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct LNode{
  int data;
  struct LNode *next;
}LNode,*LinkList;
//初始化一个单链表 (带头结点)
bool InitList(LinkList &L){
    L=(LNode*)malloc(sizeof(LNode));
	if(L==NULL)
	    return false;
    L->next=NULL; 
	return true;
} 
//判断单链表是否为空 (带头结点)
bool Empty(LinkList L){
    if(L->next==NULL)
	   return  true;
	else
	   return false;
} 
//后插操作:在p结点之后插入元素e 
bool InsertNextNode(LNode *p,int e){
	if(p==NULL)   //i值不合法 
	   return false;
	LNode *s=(LNode*)malloc(sizeof(LNode));
	if(s==NULL)    //内存分配失败 //在某些情况下可能分配失败(如内存不足) 
	   return false;
	s->data=e;         //用结点s保存数据元素e 
	s->next=p->next;
	p->next=s;    //将节点s连到p之后 
	return true; 
}
//在第i个位置插入元素e(带头结点) 
bool ListInsert(LinkList &L,int i,int e){
	if(i<1)
	    return false;
	LNode *p;  //指针p指向当前扫描到的结点
	int j=0;   //当前p指向的是第几个结点
	p=L;     //L指向头结点,头结点是第0个结点(不存数据)
	while(p!=NULL&&j<i-1){ //循环找到第i-1 个结点 //找位置 
		p=p->next;
		j++;
	}
	return InsertNextNode(p,e); //插入成功 
}
int main(){
	LinkList L; //声明一个指向单链表的指针 
	InitList(L);
	Empty(L); 
	ListInsert(L,1,9);
}
 

指定结点的前插操作

1.使用带头结点的单链表,遍历指定结点的位置

(待完成)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct LNode{
  int data;
  struct LNode *next;
}LNode,*LinkList;
//初始化一个单链表 (带头结点)
bool InitList(LinkList &L){
    L=(LNode*)malloc(sizeof(LNode));
	if(L==NULL)
	    return false;
    L->next=NULL; 
	return true;
} 
//判断单链表是否为空 (带头结点)
bool Empty(LinkList L){
    if(L->next==NULL)
	   return  true;
	else
	   return false;
} 

//在第i个位置插入元素e(带头结点) 
LNode* ListInsert(LinkList &L,int i,int e){
	LNode *p;  //指针p指向当前扫描到的结点
	int j=0;   //当前p指向的是第几个结点
	p=L;     //L指向头结点,头结点是第0个结点(不存数据)
	while(p!=NULL&&j<i-1){ //循环找到第i-1 个结点 //找位置 
		p=p->next;
		j++;
	}
	if(p==NULL||i<1)   //i值不合法 
	  {
	  		printf("i值:%d,小于1,i不合法",i); 
		return	p;
	  }
	LNode *s=(LNode*)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;   //将结点s连到p之后 
	return s; //插入成功 
}
bool InsertPriorNode(LinkList L,LNode *p,int e){
	LNode *q;  //指针p指向当前扫描到的结点
	int j=0;   //当前p指向的是第几个结点
	q=L->next;     //L指向头结点,头结点是第0个结点(不存数据)
	while(q->data!=p->data){ //比较元素,找到位置 
		q=q->next;
		j++;
	}
    j--; 
	q=L->next; 
	while(q!=NULL&&j<j-1){ //循环找到第i-1 个结点 //找位置 
		q=q->next;
		j++;
	}
	if(p==NULL)   
	   return false;
	q->next=s;
	LNode *s=(LNode*)malloc(sizeof(LNode));
	s->data=e;
	s->next=p;
	
	
	if(L->next!=NULL){
		
		printf("%d",L->data);
//	   do{
//	   	  printf("%d",p->data);
//	   	  p=p->next;
//	   }while(p!=NULL);
	}
	
//	while(q!=NULL){
//		q=q->next;
//		printf("%d",q->data);
//	}
	
	return true; //插入成功 
}
int main(){
	LinkList L; //声明一个指向单链表的指针 
	InitList(L);
	Empty(L); 
	InsertPriorNode(L,ListInsert(L,1,9),22);

}

 

2.偷天换日(使用中间变量,数据互换)

(未完成)
 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct LNode{
  int data;
  struct LNode *next;
}LNode,*LinkList;
//初始化一个单链表 (带头结点)
bool InitList(LinkList &L){
    L=(LNode*)malloc(sizeof(LNode));
	if(L==NULL)
	    return false;
    L->next=NULL; 
	return true;
} 
//判断单链表是否为空 (带头结点)
bool Empty(LinkList L){
    if(L->next==NULL)
	   return  true;
	else
	   return false;
} 

//在第i个位置插入元素e(带头结点) 
LNode* ListInsert(LinkList &L,int i,int e){
	LNode *p;  //指针p指向当前扫描到的结点
	int j=0;   //当前p指向的是第几个结点
	p=L;     //L指向头结点,头结点是第0个结点(不存数据)
	while(p!=NULL&&j<i-1){ //循环找到第i-1 个结点 //找位置 
		p=p->next;
		j++;
	}
	if(p==NULL||i<1)   //i值不合法 
	  {
	  		printf("i值:%d,小于1,i不合法",i); 
		return	p;
	  }
	LNode *s=(LNode*)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;   //将结点s连到p之后 
	return s; //插入成功 
}
//前插操作:在p结点之前插入元素e 
bool InsertPriorNode(LNode *p,int e){
	if(p==NULL)
	    return false;
	LNode *s=(LNode*)malloc(sizeof(LNode));
	if(s==NULL){
		return false;
	}
	s->next=p->next;
	p->next=s;       //新结点s连到p之后 
    s->data=p->data;     //将p元素复制到s中 
	p->data=e;          //p中元素覆盖为e 
	return true;
}
int main(){
	LinkList L; //声明一个指向单链表的指针 
	InitList(L);
	Empty(L); 
	InsertPriorNode(ListInsert(L,1,77),2);

}

 

LNode * GetElem(LinkList L ,int i){
  int j=1;
  LNode *p=L->next;
  if(i==0)
    return L;
  if(i<1)
   return NULL;
  while(p!=NULL&&j<i){
   p=p->next;
   j++;
}文章来源地址https://www.toymoban.com/news/detail-710921.html

到了这里,关于2.3 线性表的链式表示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线性表的链式存储结构——链表

    目录 一、顺序表优缺点 二、链表的定义 ①:概念: ②:结点 ③:单链表的定义: ④:头结点: 三 、单链表的C语言结构定义: 四、单链表基本操作: 四.1、遍历单链表 四.2、用malloc函数创建新结点 四.3、尾插法 四.4、头插法 四.5、尾删法 四.6、头删法 优点:我们知道顺

    2024年02月08日
    浏览(45)
  • 数据结构:线性表的链式储存

     🌈个人主页:Rookie Maker 🔥 系列专栏:数据结构 🏆🏆关注博主,随时获取更多关于IT的优质内容!🏆🏆   😀欢迎来到我的代码世界~ 😁 喜欢的小伙伴记得一键三连哦 ૮(˶ᵔ ᵕ ᵔ˶)ა ​ 链表:线性表的链式储存方式,逻辑结构不一定连续,物理结构不一定连续 描述

    2024年04月27日
    浏览(36)
  • 数据结构-线性表的链式存储(包含代码实现)

    链式存储结构 结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻 线性表的链式存储结构又称为 非顺序映像 或 链式映像。 用一组 物理位置任意的存储单元 来存放线性表的数据元素 这组存储单元既可以是连续的,也可以是不连续的,甚至是零散

    2024年02月06日
    浏览(53)
  • 【玩转408数据结构】线性表——线性表的顺序表示(顺序表)

            通过前文,我们了解到线性表是具有相同数据类型的有限个数据元素序列;并且,线性表只是一种逻辑结构,其不同存储形式所展现出的也略有不同,那么今天我们来了解一下线性表的顺序存储——顺序表。         顺序表指的是将 逻辑上相邻的元素 存储在 物理位

    2024年02月19日
    浏览(52)
  • 第 2 章 线性表 (线性表的单链表存储结构实现)

    1. 背景说明   2. 示例代码  1) status.h 2) singleLinkList.h 3) singleLinkList.c 4) algorithm.h 5) algorithm.c 6) auxiliary.h 7) auxiliary.c 8) main.c 3. 运行示例

    2024年02月09日
    浏览(28)
  • 线性表的基本操作及在顺序存储及链式存储的实现

    一个数据结构的基本操作是指其最核心、最基本的操作。其他较复杂的操作可通过其基本操作来实现。线性表的主要操作如下 注意:1:基本操作的实现取决于采用哪种存储结构,存储结构不同,算法的实现也不同 2:“” 表示c++中的引用调用。若存入的变量是指针变量,且

    2024年02月13日
    浏览(44)
  • 【数据结构与算法】二、线性表的顺序表示【硬核】

    图书表的顺序存储结构类型定义: 在调用函数的过程中,当形参为引用类型时,实参和形参占用了相同的空间 2.4.1 线性表的基本操作: 2.4.2 线性表L的初始化 2.4.3 销毁和清空线性表L 2.4.4 求线性表L的长度以及判断线性表L是否为空 2.4.5 顺序表的取值(根据位置i获取相应位置

    2023年04月26日
    浏览(53)
  • Visual Studio 线性表的链式存储节点输出引发异常:读取访问权限冲突

    问题: 写了一个线性表的链式存储想要输出,能够输出,但是会报错:读取访问权限冲突 分析: 当我们输出到最后倒数第二个节点时,p指向倒数第二个节点并输出; 下一轮循环:p指向倒数第二个节点不为NULL,于是指向倒数第一个节点并输出; 下一轮循环:p指向倒数第一

    2024年02月09日
    浏览(44)
  • 数据结构--单链表的定义

    单链表的定义(如何用代码实现) 优点:不要求大片连续空间,改变容量方便 缺点:不可随机存取,要耗费一定空间存放指针 为了方便 我们经常使用 typedef t y p e d e f 数据类型 别名 color{purple}typedef 数据类型 别名 t y p e d e f 数据类型 别名 代码一: 代码二: 代码一与代码二是

    2024年02月11日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包