【数据结构笔记】线性表-单链表

#include <iostream>
#include <stdlib.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */


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

//初始化一个空的单链表 
bool InitList(LinkList &L){
	L=NULL;
	return true;
}

void test(){
	LinkList L;  //头结点 
	InitList(L); //使其成为空表 
}

//指定结点的后插操作(在p结点后插入数据元素e) 

bool InsertNextNode(LNode *p,int e){  //p是一个已经指向结构体LNode的指针 
	if(p==NULL)		 
		return false;
	LNode *s=(LNode *)malloc(sizeof(LNode));	//新建一个指向LNode的指针 
	if(s==NULL)
		return false;
	s->data=e;		//给新建的指针赋值、插入到p后面 
	s->next=p->next;
	p->next=s;
	return true;
}

//按位查找,返回第i个元素(有头结点)
LNode * GetElem(LinkList L,int i){
	if(i<1)
		return NULL;
	LNode *p;
	int j=0;
	p=L;
	while(p!=NULL&&j<i){		//找到第i个元素 
		p=p->next;
		j++;
	}
	return p;
} 

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

//按位序插入,即在位序为i的位置插入数据元素e(带头结点)
bool ListInsert(LinkList &L,int i,int e){   //在位序为i的位置插入值为e的数据 

	LNode *p=GetElem(L,i-1);		//用了定义的“找到第i-1个结点的函数” 
	
	return(InsertNextNode(p,e));  //用了前面定义的在p结点后插入e的函数 

} 

//按位序插入(不带头结点)
bool ListInsert2(LinkList &L,int i,int e){
	if(i<1)
		return false;
	if(i==1){
		LNode *s=(LNode *)malloc(sizeof(LNode));		//新建一个结点作为“头结点 ”
		s->data=e;	 //赋插入的值 
		s->next=L;	//s指向“旧的头指针” 
		L=s;		//s成为新的头指针 
	}
	
	LNode *p;
	int j=0;
	
	if(p==NULL)
		return false;
	
	while(p!=NULL&&j<i-1){
		p->next;
		j++;
	}
	
	return(InsertNextNode(p,e)); 

} 

//指定结点的前插操作(在p结点前插入元素e)
bool InserPriorNode(LNode *p,int e){
	if(p==NULL) //就不能在NULL前面插入吗? 
		return false;
	LNode *s=(LNode *)malloc(sizeof(LNode));
	if(s==NULL)		//以免内存分配失败
	return false;
	s->next=p->next;		//偷天换日系列,新建的s指针作为“旧的p指针”,而p变成s指针前一个,具有元素e; 
	p->next=s;
	s->data=p->data;
	p->data=e;
	return true;
	
} 

//前插操作2
bool InserPriorNode2(LNode *p,LNode *s){
	if(p==NULL||s==NULL)
		return false;
	int temp=p->data;
	s->next=p->next;
	p->next=s;
	p->data=s->data;		//s带有插入的数据元素e 
	s->data=temp;
	return true;
	
} 
 
//按位序删除,即删除表中位序为i的元素,并返回e作为被删除的元素值(带头结点) 
bool ListDelete(LinkList L,int i,int &e){		//注意e的值是需要返回的,所以这里要& 
	if(i<1)
		return false;
	LNode *p;
	int j=0;
	while(p!=NULL&&j<i-1){
		p=p->next;
		j++;
	}
	if(p==NULL||p->next==NULL)		//排除第i-1个结点是空或之后无结点的情况 
		return false;
	
	LNode *q=p->next;
	e=q->data;		//返回被删除的元素的值 
	p->next=q->next;
	free(q); 		//释放工具人q的存储空间 
	return true;
}

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

//按值查找,找到数据元素值==e的结点
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){
	int len=0;
	LNode *p=L;
	while(p->next!=NULL){		//头结点不计入表长 
		p=p->next;
		len++;
	}
	return len;		L 0 1 NULL
} 

int main(int argc, char** argv) {
	
	cout <<"***Everthing is Fine at present***\n";
	return 0; 
} 

【注】LinkList 和LNode *作用一样,前者强调是单链表,后者强调是指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值