单链表的基本操作(涉及C++)

一、单链表的基本操作(涉及C++)

涉及C++的部分主要是当需要修改单链表的时候,到底是不使用C++的语法从而通过传递头指针的指针(二级指针)来实现对链表的修改,还是使用C++的语法而通过取头指针的引用(&L)来实现对链表的修改,本文采用了第二种方法,第一种方法也行,不过当要修改头指针的时候需要使用取值运算符*,而且还要用括号单独括起来才不会出错,显然比较麻烦,第二种注意文件名后缀必须为.cpp否则会报错。

二、代码展示

//注意点:&表示引用,传参的时候不需要带符号,引用后的变量和实参一致,修改形参即可修改实参
//单链表的基本操作
#include <stdio.h>
#include <stdlib.h>
//1.单链表的点定义
typedef struct LNode{
	int year;
	struct LNode *next;
}LNode,*LinkList;

//2.单链表的创建(头插法)
 LinkList ListHeadInsert(LinkList &L){
	LNode *s;
	int x;
	L=(LinkList)malloc(sizeof(LNode));
	L->next=NULL;
	scanf("%d",&x);
	printf("success\n");
	while(x!=999){
	s=(LNode*)malloc(sizeof(LNode));
	s->year=x;
	s->next=L->next;
	L->next=s;
	scanf("%d",&x);	
	printf("success\n");
	}	
	return L;
 }
 
 //3.单链表的创建(尾插法)
 LinkList ListTailInsert(LinkList &L){
 	LNode *r,*s;
 	int x,count=0;
 	L=(LinkList)malloc(sizeof(LNode));
 	r=L;
 	L->next=NULL;
 	scanf("%d",&x);
 	while(x!=999){
 		s=(LNode*)malloc(sizeof(LNode));//创建新节点并使得指针s指向新节点
 		s->year=x;
 		r->next=s;
 		r=s;
 		printf("第%d条数据加入成功\n\n",++count);
 		scanf("%d",&x);
	 }
	 r->next=NULL;
	 printf("单链表创建完成,长度为%d\n",count);
	 return L;
 }
 
 //4.单链表的按序号(位序)查找法
 
 LNode* GetElem(LinkList L,int i){
 	if(i<-1)
 	return NULL;//返回值类型为指针,不是bool值
 	LNode *p=L->next;//定义指针指向第一个元素
 	for(int j=1;j<i&&p!=NULL;j++){
 		p=p->next;
	 }
	 return p;
 }
 
 //5.单链表的按值查找
 LNode* LocateElem(LinkList L,int e){
 	LNode *p=L->next;
 	while(p->year!=e&&p!=NULL){
 		p=p->next;
	 }
	 return p;
 }
 
 //6.单链表的插入结点操作(按位序插入,前插法)
 
 bool Insert(LinkList &L,int year,int i){
 	if(i<1){
 		return false;
	 }
	 LNode *prev=GetElem(L,i-1);//寻找被插入位置的前驱结点
	 LNode *s=(LNode*)malloc(sizeof(LNode));//创建新结点
	 s->year=year;
	 s->next=prev->next;
	 prev->next=s;
	 return true;
 }
 
 //7.打印单链表的全部数据
 void PrinList(LinkList L){
 	int count=1;
 	while(L->next!=NULL){
 		L=L->next;
 		printf("第%d条数据为:%d\n",count++,L->year);
	 }
 }
  
  //8.单链表的插入结点操作(后插法)
  bool TailInsert(LinkList L,int year,int i){
  	if(i<1)
  	return false;
  	LNode *p=GetElem(L,i);
  	LNode *s=(LNode*)malloc(sizeof(LNode));
  	s->year=year;
  	s->next=p->next;
  	p->next=s;
  	return true;
  }
  
  //9.单链表的删除操作
  bool Del(LinkList &L,int i){
  	if(i<1)
  	return false;
  	LNode *prev=GetElem(L,i-1);
  	LNode *del=prev->next;
  	prev->next=prev->next->next;//或者prev->next=del->next
  	free(del);
  	return true;
  }
  
  //10.求解单链表表长
  int ListLength(LinkList L){
  	int count=0;
  	while(L->next!=NULL){
  		L=L->next;
  		count++;
	  }
	  return count;
  }
  
  //主函数
 int main(){
 	LinkList L;
 	int year,i;
 	//1.采用尾插法创建单链表也可采用头插法创建单链表,只不过顺序会与输入的顺序相反
 	L=ListTailInsert(L);
 	//2.按位序查找,此句查找位序为2的结点,返回值是结点位序为2的指针,如果i不在合理范围返回NULL
 	printf("查询值为%d",GetElem(L,2)->year);
 	//3.按值查找,返回值为指向该值所在的结点,如果未找到返回NULL
 	printf("查询值为%d",LocateElem(L,89)->year);
 	printf("请输入需要插入的年纪和位序\n");
 	scanf("%d",&year);
 	scanf("%d",&i);
 	//4.插入结点,前插法,如在位序为2插入一个结点,则新结点为2,后插法则新结点位序为3
 	if(Insert(L,year,i))
	 printf("插入成功!\n");
	 PrinList(L);
	 printf("请输入需要删除的位序\n");
	 scanf("%d",&i);
	 //5.按位序删除结点
	 if(Del(L,i))
	 printf("删除成功!\n");
	 //6.按位序从小到大打印单链表的全部数据
	 PrinList(L);
	 //7.求表长,返回值为int型
	 printf("表长为%d\n",ListLength(L));
 	return 0;
 }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值