不带头结点的单链表

不带头结点单链表实现

/*
	不带头结点的链表的实现:
	核心是直接设置头指针指向第一个节点
	要注意此时的L的地址可能会发生改变.
	同时还要注意一级指针和二级指针的区别. 
	注意LinkList L和LinkList *L的区别
	和带结点的单链表的操作相比较,
	要考虑到头指针就是头结点,在一些会改变头结点的情况下要仔细考虑. 
	 
*/ 

#include <stdio.h>
#include <stdlib.h>

#define null NULL
typedef int Elemtype;
typedef struct LNode{
	Elemtype data;
	struct LNode *next;
}node,*LinkList;

//初始化 
bool InitList(LinkList *L){//传入参数是一个二级指针,这样才能真正修改地址 
	(*L)=NULL;
	return true;
}

//判空
bool IsEmpty(LinkList L){
	return (L==NULL);
} 

//遍历
bool PrintList(LinkList L){
	Elemtype e;
	node *tem=L;
	while(tem!=null){
		e=tem->data;
		tem=tem->next;
		printf("%d ",e);
	}	
	printf("\n");
	return true;
} 


//头插法建表
bool CreateFromHead(LinkList *L){//涉及L的地址改变传入二级指针 
		int flag=1;
		Elemtype ch;
		node *tem;
		while(flag){
			scanf("%d",&ch);
			if(ch!=9999){
				tem=(node*)malloc(sizeof(node));
				if(tem==null){
					return false;
				}
				tem->data=ch;
				tem->next=(*L);
				(*L)=tem;
			}
			else{
				flag=0;
			}
		}
		return true;		
} 



//尾插法建表
bool CreateFromTail(LinkList *L){//涉及L的改变,传入的是一个二级指针. 
	int flag=1;
	Elemtype ch;
	node *tem,*p;//p是尾指针 
	while(flag){
		scanf("%d",&ch);
		if(ch!=9999){
			tem=(node*)malloc(sizeof(node));
			if(tem==null){
				return false;
			}
			tem->data=ch;
			if((*L)==null){
				(*L)=tem;
				p=(*L); 
			}
			p->next=tem;
			tem->next=null;
			p=tem;
		}else{
			p->next=null;
			flag=0;
		}
	}
	return true;
} 



//按位查找
bool GetElem(LinkList L,int index,Elemtype *e){
	node *tem=L;
	int i=1;
	while(i<index&&tem!=null){
		tem=tem->next;
		i++;
	}
	if(i==index){
		*e=tem->data;
		return true;
	}
	return false;
} 


//按值查找
bool LocalElem(LinkList L,int *index,Elemtype e){
	node *tem=L;
	int i=1;
	while(tem!=null&&L->data!=e){
		tem=tem->next;
		i++;
	}
	if(L==null){
		return false;
	}
	*index=i;
	return true;
}


//插入数据
bool InsertList(LinkList *L,int index,Elemtype e){
	node *tem;
	node *p=*L;
	if(index<1||L==null){
		return false;
	}
	int i=1;
	while(i<index-1&&p!=null){
		p=p->next;
		i++;
	}	
	if(p==null){
		return false;
	}
	tem=(node*)malloc(sizeof(node));
	if(tem==null){
		return false;
	}
	tem->data=e;
	if(p==*L){
		tem->next=*L;
		*L=tem;
	}else{
		tem->next=p->next;
		p->next=tem;	
	}
	return true;
}


//删除数据
bool DelList(LinkList *L,int index,Elemtype *e){
	node *p=*L;
	int i=1;
	if(index<1||*L==null){
		return false;
	}
	while(p!=null&&i<index-1){
		p=p->next;
		i++;
	}
	if(p==null){
		return false;
	}
	node *tem;
	if(p==(*L)){
		*L=p->next;
		*e=p->data; 
	}else{
		*e=tem->data;
		tem=p->next;
		p->next=tem->next;	
	}
	free(tem);
	return true;
} 

//逆序
bool ReverseList(LinkList L){
	node *NewList;//新链表的头指针 
	if(InsertList(NewList)){
		node *tem;
		while(L!=null){
			if(NewList==null){
				NewList=L;
				L=L->next;
			}else{
				tem=L->next;
				L->next=NewList;
				L=tem;
			}
		}
	} 
	else{
		return false;
	}
	return true;	
}


//main() 
int main(){
	LinkList L;
	InitList(&L);
	PrintList(L);
	//CreateFromHead(&L);
	CreateFromTail(&L);
	PrintList(L);
	int e;
	//GetElem(L,1,&e);
	//printf("%d\n",e);
	//LocalElem(L,&e,2);
	//printf("%d\n",e);
	//InsertList(&L,1,99); 
	//PrintList(L);
	DelList(&L,1,&e);
	printf("%d",e);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值