线性表——单链表

该博客详细介绍了使用C++编程实现链表的各种操作,包括初始化、判断空链表、按位插入、后插、前插、按位删除、删除指定节点、按位查找、按值查找、求链表长度、尾插、头插以及打印链表内容。主要通过结构体定义节点并进行动态内存分配。在主函数中展示了部分操作的示例应用。
摘要由CSDN通过智能技术生成
#include <iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;

typedef struct LNode{
	int data;
	LNode *next;
}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;
}
//按位插入
bool ListInsert(LinkList &L,int i,int e){
	if(i<1)
		return false;
	int j=0;
	LNode *p;
	p=L;
	while(p!=NULL&&j<i-1){
		p=p->next;
		j++;
	}
	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 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;
	free(s);	
	return true;
}

//前插操作
bool InsertPriorNode(LNode *p,int e){
	if(p==NULL)
		return false;
	LNode *s=(LNode *)malloc(sizeof(LNode));
	if(s==NULL)
		return false;
	s->data=p->data;
	s->next=p->next;
	p->next=s;
	p->data=e;
	free(s); 
} 
//按位删除
bool ListDelete(LinkList &L,int i,int &e){
	if(i<1)
		return false;
	int j=0;
	LNode *p;
	p=L;
	while(p!=NULL&&j<i-1){
		p=p->next;
		j++;
	}
	if(p==NULL)
		return false;
	if(p->next==NULL)
		return false;
	LNode *q=p->next;
	e=q->data;
	p->next=q->next;
	free(q);
	return true;
	
	
} 
//删除指定节点
bool DeleteNode(LNode *p){
	if(p==NULL)
		return false;
	LNode *q=p->next;
	p->data=q->data;
	p->next=q->next;
	free(q);
	return true; 
} 

//按位查找
LNode *GetElem(LinkList L,int i){
	if(i<1)
		return NULL;
	int j=0;
	LNode *p;
	p=L;
	while(p!=NULL&&j<i){
		p=p->next;
		j++;
	}
	return p; 
		
}

//按值查找
LNode *LocateElem(LinkList L,int e){
	LNode *p=L->next;
	while(p!=NULL&&p->data!=e){
		p=p->next;
	}
	return p;
}

//求表的长度
int length(LinkList L){
	LNode *p=L;
	int len=0;
	while(p->next!=NULL){
		len++;
		p=p->next;
	}
	return len;	
} 
//尾插操作 
LinkList List_TailInsert(LinkList &L){
	int x;
	L=(LinkList)malloc(sizeof(LNode));
	L->next=NULL;
	LNode *s,*r=L;
	scanf("%d",&x);
	while(x!=999){
		s=(LNode *)malloc(sizeof(LNode));
		s->data=x;
		r->next= s;
		r=s;
		scanf("%d",&x);
	}
	r->next=NULL;
	return L;
} 
//头插法 
LinkList List_HeadInsert(LinkList &L){
	int x;
	L=(LinkList)malloc(sizeof(LNode));
	L->next=NULL;
	LNode *s;
	cout<<"请输入x:";
	scanf("%d",&x);
	while(x!=999){
		s=(LNode *)malloc(sizeof(LNode));
		s->data=x;
		s->next=L->next;
		L->next= s;
		scanf("%d",&x);
	}
	return L;
} 
void LinkListPrint(LinkList L){
	for(LNode* p =L->next;p!=NULL;p=p->next)
		cout<<p->data<<" ";
	cout<<endl;
}

//P17.2.1删除最小值的元素,并返回。空出的位置由最后一个位置填补
void DeleteMin(LinkList &L,int &e) {
	LNode *p,*m;
	int x;
	p=L;
	e=p->next->data;
	for(p=L->next;p!=NULL;p=p->next){
		if(p->data<=e) {
			e=p->data;
			m=p;
		}
		if(p->next->next==NULL) {
			x=p->next->data;
			m->data=x;
			p->next=NULL;
		}
	}
}

int main(int argc, char** argv) {
	LinkList L;
	InitList(L);
	cout<<"isEmpty:"<<Empty(L)<<endl;
	
	List_HeadInsert(L);
	cout<<"isEmpty:"<<Empty(L)<<endl;
	cout<<" 输出 x:";
	LinkListPrint(L);
	
	int e;	
	DeleteMin(L,e);
	cout<<"输出e:"<<e<<endl;
	cout<<" 输出 x:";
	LinkListPrint(L);
	
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值