4.数据结构_单链表(带头结点)

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;

typedef struct LNode{
	int data;			//存放的数据元素 
	struct LNode *next;//指针指向下一个结点 
}LNode,*LinkList;
//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个元素(带头结点)
LNode * GetElem(LinkList L ,int index){
	if(index<1){
		return NULL;
	}
	LNode *p = L;
	int j = 0 ;
	while(p!=NULL && j<index){
		p = p->next;
		j++; 
	}
	return p;
	
} 
 


//指定结点的后插
bool InsertNextNode(LNode *p,int e){
	if(p==NULL){
		return false;
	}
	LNode *s = (LNode *)malloc(sizeof(LNode));
	if(s==NULL){//内存分配失败,(可能存在这种情况) 
		return false;
	}
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true; 
} 



//按位序插入
bool ListInsert(LinkList &L,int index,int e){
	if(index<1){
		return true;
	}
	
	LNode *p = L;
	int j = 0;
	
	while(p!=NULL && j<index-1){//好好理解一下这个index-1的情况 
		p = p->next;
		j++;
	}
//	LNode *p = GetElem(L,index-1);


//	if(p==NULL){//i值不合法!!!!! 
//		return false;
//	}
//	LNode *s = (LNode *)malloc(sizeof(LNode));
//	s->data = e;
//	s->next = p->next;
//	p->next = s;
//	return true;
//上述注释代码可换成: 
	return InsertNextNode(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->data = p->data;
	p->data = e;
	
	return true;
	
} 







//按位序删除
bool ListDelete(LinkList &L,int index,int e){
//	if(index<1){
//		return false;
//	}
//	LNode *p = L;
//	int j = 0;
//	while(p!=NULL && j<index-1){
//		p = p->next;
//		j++;
//	}
	//上面注释的代码可以改成:(调用函数了) 
	LNode *p = GetElem(L,index-1);
	
	
	if(p==NULL){//i值不合法 
		return false;
	}
	if(p->next == NULL){//第i-1个结点之后没有其他结点 
		return false;
	}
	
	LNode *q = p->next;
	p->next = q->next;
	free(q);
	return true;
}



//删除指定结点
bool DeleteNode(LNode *p){
	if(p==NULL){
		return false;
	}
	LNode *q = p->next;
	p->next = q->next;
	p->data = q->data;
	free(q);
	return true;
	
}


//按值查找
LNode * LocateElem(LinkList L,int e){
	LNode *p = L->next;
	while(p!=NULL && p->data!=e){
		p = p->next;
	}
	return p;//找到后返回该结点指针 
} 
 

//求表长
	//自己的想法 
int ListLength1(LinkList L){
	LNode *p = L->next;
	int len = 0;
	while(p!=NULL){
		len ++;
		p = p->next;
	}
	return len;
} 
	//视频中的逻辑 
int ListLength2(LinkList L){
	LNode *p = L;
	int len = 0;
	while(p->next != NULL){
		p = p->next;
		len++;
	}
	return len;
}



//单链表的建立
//尾插法建立链表
LinkList List_TailInsert(LinkList &L) {
	L = (LinkList)malloc(sizeof(LNode));//建立头结点 
	LNode *s,*r = L;
	int x;
	cin>>x;
	while(x!=9999){
		s = (LNode *)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r=s;		//使r指向表尾结点 
		cin>>x;
	}
	r->next = NULL;//表尾指针置空 
	return L; 
}
//头插法建立链表
LinkList List_HeadInsert(LinkList &L){
	L = (LinkList)malloc(sizeof(LNode));//建立头结点 
	L->next = NULL;//必须要有这一步,内存中可能有脏数据的,不知道指向哪 
	int x;cin>>x;
	while(x!=9999){
		LNode *s = (LNode *)malloc(sizeof(LNode));
		s->data = x;
		s->next = L->next; 
		L->next = s;
		cin>>x;
	}
	return L;
}





int main(){
	LinkList L;
	InitList(L);//函数定义时参数是引用类型,那么传参的时候应该也是引用类型吧????????????????????????? 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值