线性表的链式存储之单链表

目录

        1、特点

        2、基本类型的定义

        3、基本操作的实现

        (1)建立单链表

        (2)按序号查找结点

        (3)按值查找结点

        (4)插入结点

        (5)删除结点


        1、特点

        (1)通过一组任意的存储单元来存储线性表中的数据元素。

        (2)是非随机存取的存储结构;不能直接找到标表中的某个特定的节点,需要从表头开始遍历,依次查找。

        (3)通常用头指针来标识一个单链表,如单链表L,头指针为空则表示一个空表。

        2、基本类型的定义

//单链表的定义
typedef struct LNode{
	int data;				//数据域 
	struct LNode *next;		//指针域 
}LNode,*LinkList;

        3、基本操作的实现

        (1)建立单链表

        头插法(带头节点)

//头插法建立单链表 
 LinkList List_HeadInsert(LinkList &L){
 	LNode *s;
 	int data_insert;
 	L = (LinkList)(malloc(sizeof(LNode)));	//创建头节点
 	L->next = NULL; 
	cin>>data_insert;
	while(data_insert != 9999) {
		s=(LNode*)(malloc(sizeof(LNode)));	//创建一个新的节点,s指向这个新节点的起始位置 
		s->data=data-insert;
		s->next=L->next;
		L->next=s;							//将新节点插入表中,L为头指针 
		cin>>data_insert; 
	}
	return L;
 } 

        时间复杂度为O(n)

        头插法(不带头结点)

 //头插法建立单链表 (不带头结点) 
 LinkList List_HeadInsert(LinkList &L){
 	LNode *s;
 	int data_insert;
	cin>>data_insert;
	while(data_insert != 9999) {
		s=(LNode*)(malloc(sizeof(LNode)));	//创建一个新的节点,s指向这个新节点的起始位置 
		s->data=data_insert;
		if(L==NULL){						//如果单链表为空,则将s作为首节点 
			L=s;
		} 
		else{								//将s插入第一个节点之前 
			s->next=L;
			L=s;
		}					
		cin>>data_insert; 
	}
	return L;
 } 

        时间复杂度为O(n)

        尾插法(带头结点)

//尾插法建立单链表(带头结点)
LinkList List_TailInsert(LinkList &L){
	LNode *s,*r;			//s为数据节点,r表示表尾指针 
	int data_insert;
	L=(LinkList)(malloc(sizeof(LNode)));
	r=L;
	cin>>data_insert;
	while(data_insert!=9999){
		s=(LNode*)(malloc(sizeof(LNode)));
		s->data=data_insert;
		r->next=s;
		r=s;		    //r指向新的表尾指针 
		cin>>data_insert;
	}
	r->next=NULL;
	return L; 
} 

        时间复杂度为O(n)

        尾插法 (不带头结点)

//尾插法建立单链表(不带头结点)
LinkList List_TailInsert01(LinkList &L){
	LNode *s,*r;			//s为数据节点,r表示表尾指针 
	int data_insert;
	L=NULL;
	r=L;
	cin>>data_insert;
	while(data_insert!=9999){
		s=(LNode*)(malloc(sizeof(LNode)));
		s->data=data_insert;
		if(r==NULL){		//创建单链表的第一个节点 
			L=s;
			r=s;
			s->next=NULL; 
		} 
		else{
			r->next=s;
			r=s;
		}
		cin>>data_insert;
	}
	r->next=NULL;
	return L; 
} 

        (2)按序号查找结点

//按序号查找结点值
LNode* GetElem(LinkList L,int i){
	LNode *p=L->next; 
	int j = 1;		//计数,初始为1
	if(i==0){
		return L;
	} 
	else if(i<0){
		return NULL;
	}
	else{
		while(p&&j<i){		//从第一个结点开始查找 
			p=p->next;
			j++;
		}
	}
	return p;
} 

         时间复杂度为O(n) 

        (3)按值查找结点

//按值查找
LNode* LocateElem(LinkList L,int e){
	LNode *p=L->next;
	while(p&&p->data!=e){		//从第一个结点开始查找元素为e的结点 
		p=p->next;
	}
	return p;
} 

         时间复杂度为O(n) 

        (4)插入结点

//插入结点的操作
LinkList ListInsert(LinkList L,int i,LNode *s){
	int data;			//插入的数据 
	LNode *p=GetElem(L,i-1);	//p指向插入位置的前驱节点 
	s=(LNode*)(malloc(sizeof(LNode)));
	cin>>data;
	s->data=data;
	s->next=p->next;
	p->next=s;
	return L;
}

        (5)删除结点

 //删除结点的操作
 LinkList ListDelete(LinkList &L,int i){
 	LNode *p,*q;
 	p=GetElem(L,i-1);	//p指向删除位置的前驱节点 
 	q=p->next;
 	p->next=q->next;
 	free(q);
 	return L;
 } 

        时间复杂度为O(n)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值