单链表基本操作的实现

(1)头指针:是指向链表中第一个结点的指针。若链表设有头结点,则头指针所指结点为线性表的头结点;若链表不设头结点,则头指针所指结点为该线性表的首元结点。
(2)头结点:是在首元结点之前附设的一个结点,其指针域指向首元结点。头结点的数据域可以不存储任何信息,也可存储与数据元素类型相同的其他附加信息。例如,当数据元素为整数型时,头结点的数据域中可存放该线性表的长度。
(3)首元结点:指链表中存储第一个数据元素的结点。

#include <iostream>
using namespace std;

/*----------单链表的存储结构----------*/
typedef struct LNode
{
	int data;	//结点的数据域
	LNode *next;	//结点的指针域
}*LinkList;		//LinkList为指向结构体LNode的指针类型

LNode *p,*s,*q;

void CreateList_H(LinkList &L,int n)	//前插法创建单链表(逆序)
{
	L=new LNode;	//生成新结点作为头结点,用头指针L指向头结点
	L->next=NULL;	//先建立一个带头结点的空链表
	for(int i=0;i<n;i++)
	{
		p=new LNode;	//生成新结点*p
		cin>>p->data;	//输入元素值赋给新结点*p的数据域
		p->next=L->next;	
		L->next=p;	//将新结点*p插入到头结点之后
	}
}

LNode *LocateElem(LinkList L,int e)		//查找值为e的元素
{
	p=L->next;	//初始化,p指向首元结点
	while(p&&p->data!=e)	//顺链域向后扫描,直到p为空或p所指结点的数据域等于e
		p=p->next;	//p指向下一个结点
	return p;	//查找成功返回值为e的结点地址p,查找失败p为NULL
}

int GetElem(LinkList L,int i,int &e)	//根据序号i获取元素的值,用e返回单链表L中第i个结点的数据域
{
	p=L->next;	//初始化,p指向首元结点
	int j=1;	//计数器j初值赋为1
	while(p&&j<i)	//顺链域向后扫描,直到p为空或p指向第i个元素
	{
		p=p->next;	//p指向下一个结点
		++j;		
	}
	if(!p||j>i)	return 1;	//i值不合法i>n或i<=0
	e=p->data;	//取第i个结点的数据域
	return 0;
}

int main()
{
	LinkList L;
	int n=5,e;
	CreateList_H(L,n);	//创建
	if(LocateElem(L,30))	//查找
		cout<<p->data<<" is the number we need!"<<endl;
	if(!GetElem(L,2,e))	//取值
		cout<<e<<endl;
	return 0;
}

-----------------------------------------单链表的插入---------------------------------------------------

int ListInsert(LinkList &L,int i,int e)	//在带头结点的单链表L中第i个位置插入值为e的新结点
{
	p=L;
	int j=0;
	while(p&&(j<i-1))	//查找第i-1个结点,p指向该结点
	{
		p=p->next;
		++j;
	}
	if(!p||j>i-1) return 1;	//i>n+1或者i<1
	s=new LNode;	//生成新结点*s
	cin>>e;	
	s->data=e;	//将结点*s的数据域置为e	
	s->next=p->next;	//将结点*s的指针域指向第i个结点
	p->next=s;	//将结点*p的指针域指向结点*s
	return 0;
}
	if(!ListInsert(L,1,e))
		cout<<e<<endl;
	if(!GetElem(L,2,e))	
		cout<<e<<endl;

-----------------------------------------单链表的删除---------------------------------------------------

int ListDelete(LinkList &L,int i)	//在带头结点的单链表L中,删除第i个元素
{
	p=L;
	int j=0;
	while((p->next)&&(j<i-1))	//查找第i-1个结点,p指向该结点
	{
		p=p->next;
		++j;
	}
	if(!(p->next)||(j<i-1))	return 1;	//当i>n或i<1时,删除位置不合理
	q=p->next;	//临时保存被删结点的地址以备释放
	p->next=q->next;	//改变删除结点前驱结点的指针域
	delete q;	//释放删除结点的空间
	return 0;
}
if(!ListDelete(L,1))
		cout<<e<<endl;
if(!GetElem(L,2,e))	
		cout<<e<<endl;    
原文地址:https://www.cnblogs.com/longzu/p/5257193.html