带头结点的单链表(代码完整) C++

        单链表:是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(存放的数据元素)+指针(指示下一个元素存储位置,单、双链表的最后一个节点除外,它们存储的是一个空指针NULL),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

        节点的结构如下:

节点定义:

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

        最开始的那个节点是头节点,头节点的数据域是不存放数据的,指针域指向链表的第一个节点。在单链表的定义中,带有头节点的称为带头节点单链表,不带头节点的称为不带头节点单链表。我们这次介绍的就是带头节点单链表。

具体代码如下:

#include <iostream>
using namespace std;

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

void InitList(LinkList &l){
//	l = (LNode *)malloc(sizeof(LNode ));
	l = new LNode;
	if(l == NULL) cout<<"空间分配失败"<<endl;
	else{
		l->next = NULL;
		cout<<"初始化成功"<<endl;
	}
} 

// 查找的i个位置的元素并返回元素值 
void GetElem(LinkList l,int i,int &e){
	LNode *p;
	p = new LNode;
	p=l;
	int j=0;
	while(p && j < i){	//找到第i个节点 
		p = p->next;
		j++;
	}
	
	if(p == NULL|| j>i) cout<<"位置不合法"<<endl;
	else{
		e = p->data;
		cout<<"获取成功."<<endl;
	}
}

//	查找表中第一个与e值相等的元素并返回其节点所在地址 
LNode *locateElem(LinkList l,int e){
	LNode *p;
	p = new LNode;
	p=l->next;
	while(p && p->data != e){
		p = p->next;
	}
	return p;
}

//插入(在第i个位置插入元素e) 
void LinkListInsert(LinkList &l,int i,int e){
	LNode *p;
	p = new LNode;
	p=l;
	int j=0;
	while(p && j < i-1){	//找到i的前驱 
		p = p->next;
		j++;
	}
	
	if(p == NULL) cout<<"位置不合法"<<endl;
	else{
		LNode *s;
		s = new LNode;
		s->data = e;
		s->next = p->next;
		p->next = s;
		cout<<"插入完成"<<endl;
	}
}

//删除(删除第i个位置的元素)
void LinkListDelete(LinkList &l,int i){
	LNode *p;
	p = new LNode;
	p=l;
	int j=0;
	while(p && j<i-1){	//找到i的前驱节点 
		p = p->next;
		j++;
	}
	if(p == NULL) cout<<"删除位置不合法."<<endl;
	else{
		LNode *s;
		s = new LNode;
		s = p->next;
		p->next = p->next->next;
		delete s;
	}
}

//头插法建立单链表 逆序输入链表的元素 
void CreateLinkList_head(LinkList &l,int n){
	cout<<"尾插法,请逆序输入元素的值"<<endl;
	for(int i=0;i<n;i++){
		cout<<"请输入第"<<n-i<<"个元素: "; 
		int t; 
		cin>>t;
		
		LNode *p;
		p = new LNode;
		p->data = t;
		p->next = l->next;
		l->next = p;
	}
}

//尾插法建立单链表(创建一个指向尾节点的指针) 
void CreateLinkList_tail(LinkList &l,int n){
	cout<<"尾插法,请顺序输入元素的值"<<endl;
	LNode *tail;
	tail = new LNode; 
	tail = l;
	for(int i=0;i<n;i++){
		cout<<"请输入第"<<i+1<<"个元素: "; 
		LNode *p;
		p = new LNode;
		int x;
		cin>>x;
		p->data = x;
		
		p->next = tail->next;
		tail->next = p;
		tail = p;
	}
} 

void show(LinkList l){
	LNode *p;
	p = l->next;
	while(p != NULL){
		cout<<p->data<<"  ";
		p=p->next;
	}
	cout<<endl;
}

void test(){
//	头插法建立单链表 
//	LinkList l;
//	InitList(l);
//	int n;
//	cout<<"请输入元素个数:";
//	cin>>n;
//	
//	CreateLinkList_head(l,n);
//	show(l);
	
//	尾插法建立单链表	
	LinkList s;
	InitList(s);
	int m;
	cout<<"请输入元素个数:";
	cin>>m;
	
	CreateLinkList_tail(s,m);
	show(s);

//	删除第i个位置的元素	
//	LinkListDelete(s,2);
//	show(s);

//	在第i个位置插入新元素 
//	LinkListInsert(s,2,22);
//	show(s);
	
//查找表中第一个与e值相等的元素并返回其节点所在地址 
//	LNode *t;
//	t = new LNode;
//	t = locateElem(s,3);
//	cout<<"地址:"<<t<<endl;
//	cout<<"值:"<<t->data<<endl;

// 查找的i个位置的元素并返回元素值 
//	int t;
//	GetElem(s,3,t);
//	cout<<"第3个位置的元素值为:"<<t<<endl;
	
}

int main(){
	test();
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值