数据结构 单链表

1.基本结构

typedef struct Lnode//基本结构 
{
	Elemtype data;
	struct Lnode *next;
}Lnode, *Linklist;

2.构造空表

Status IniList_L(LinkList &L)//构造空表 
{
	L = neW Lnode;//L = (Linklist) malloc(sizeof(Lnode)); //生成新节点作为头节点 
	L->next = NULL;//头节点指针域置空 
	return OK; 
}

3.判断链表是否为空 

int ListEmpty(LinkList L)//判断链表是否为空 
{
	if(L->next) return 0;//指针域非空即非空 
	else return 1; 
}

4.销毁单链表

Status DestroyList(Linklist &L)//销毁单链表L 
{
	Linklist L;
	while(L)
	{
		p = L;//刚开始指向头节点(连着头节点一起销毁),后面是把p后移 
		L = L->next;
		delete p;//free(p)   free-malloc   delete-new
	}
}

5.清空链表

Status ClearList(Linklist &L)//清空链表 
{
	Lnode *p, *q;//或者linklist p, q; 
	p = L->next;//首元节点地址 , 头节点不要清空 
	while(p)//没到表尾 
	{
		q = p->next;//记录下一节点 
		delete p;
		p = q;
	}
	L->next = NULL;//头节点指针域为空 
	return OK;
}

6.求链表元素个数

int Listlenth_L(Linklist L)//求L元素个数 
{
	Linklist p;
	P = L->next;
	i = 0;
	while(p)
	{
		i++;
		p = p->next;
	}
	return i;
}

7.取链表某一位置(i)数据 

Status GetElem_L(Linklist L, int i, Elemtype &e)//获取链表某一位置(i)数据 
{
	p = L->next; j = 1;//初始化p为首元节点
	while(p && j < i)//向后扫描直到p为空 或 p指向第i个元素 
	{
		p = p -> next;
		++j;
	}
	if(!p || j > i) return ERROR;//错误情况判断 
	e = p -> data;//取第i个元素 
	return OK;
}

8.找值为e的元素地址 (按值查找)

Lnode *LocateElem_L(Linklist L, Elemtype e)//查找值为e的元素地址 (按值查找)
{
	p = L->next;j = 1;
	while(p && p->data != e)
		p = p->next;
	return p;
}

9.查找值为e元素序号(按值查找变式) 

int LocateELem_L(LinkList L, Elemtype e)//查找值为e元素序号(按值查找变式) 
{
	p = L->next;j = 1;//j为序号 
	while(p && p-> != e)
	{
		p = p->next;
		j ++;
	}
	if(p) return j;//p不为空表示找到了 
	else return 0;//没找到 
} 

10.插入元素

Status Listinsert_L(LinkList &L, int i, Elemtype e)//在L中第i个元素之前插入e 
{
	p = L, j = 0;
	while(p && j < i - 1) //第i - 1 个节点为第i个元素 
	{
		p = p -> next;
		j++;
	}//用来找第i个元素 
	if(!p || j > i - 1) return ERROR;//插入位置非法 
	s = new LNode; s -> data = e;//生成新节点s 
	s -> next = p -> next;//s插入L (p->next 是原来p的下一节点)
	p -> next = s;
} 

11.单链表的建立:头插法 

void CreatList_H(LinkList&L,int n)
{
	L = new LNode//或者c: L = (Linklist)malloc(sizeof(LNode));	
	L->next = NULL;//建立带头节点的单链表 
	for(int i=n;i>0;i--)//倒位序插入 
	{
		p=new LNode;//申请空间
		cin>>p->data;//数组:p->data = an;//后面是an-1,,,,1 		
		p->next=L->next;//把先插入的空指针放在新节点p的next域(使得空指针一直都在最后) 	
		L->next = p;//每个节点插入前 头节点指针域为0 所以把空插入到p的指针域,
		//然后链接新节点与头节点(就是把地址p赋值给头节点的指针域 )使得前后节点连起来
	}

}//O(n)

12.单链表的建立:尾插法

void CreatList_R(Linklist&L,int n)
{
	L=new Lnode;
	L->next=NULL;//构造空链表 
	r=L;//r是尾指针 
	for(int i=0;i<n;i++)//正位序 
	{
		p=new Lnode;
		cin>>p->data;
		p->next=NULL;
		r->next=p;//插入到表尾 
		r=p;//新节点变成新的尾节点 
	} 
} //O(n)

13.链表删除节点

Status ListDelete_L(Linklist&L,int i,ElemType&e)//链表的删除 (p)
{
	p=L;j=0;
	while(p->next && j<i-1){p=p->next;++j};//找第i个节点,p指向他的前驱 
	if(!(p->next)||j>i-1) return ERROR;
	q=p->next;//临时保存被删节点的地址 
	p->next=q->next;//更改地址 
	e=q->data;//保存数据 
	delete q;//删除空间 
	return OK;
}

14.线性表合并

遍历Lb,在La查找元素 如果找不到就插到La最后 

void union(List &La,List Lb)
{
	La_len=ListLenth(La);
	Lb_len=ListLenth(Lb);
	for(int i=1;i<=Lb_lenth;i++)
	{
		GetELem(Lb,i,e);//获取链表某一位置(i)数据 
		if(!LocateElem(La,e)) ListInsert(&La,++La_len,e)//找不到值为e元素序号,补上 
	}
}//时间复杂度:O(la_len*lb_len)=O(n*n) 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值