数据结构-单链表(学习笔记)

一、单链表的结点数据类型

typedef int DataType;
struct Node
{
 	DataTpye data;
 	struct Node *next; //next为指向下一结点的指针
};

二、初始化单链表

int InitList(Node *&H)
{
	H = new Node;	//分配空间,作为头结点
	if(!H)
	{
		cout<<"初始化错误"<<endl;
		return 0;
	}
	H->next = NULL;
	return 1;
}

三、判表空

int ListEmpty(Node *H)
{
	if(H->next)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}

四、求单链表中当前元素的个数

int ListLength(Node *H)
{
	Node *p = H->next;
	int total;
	while(p)
	{
		total++;
		p=p->next;
	}
	return total;
}

五、遍历单链表

void TraveseList(Node *H)
{
	Node *p = H->next;
	while(p)
	{
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
}

六、查找指定节点

int Find_item(Node *H,DataType item)
{
	Node *p = H->next;
	int pos = 0;
	while(p)
	{
		pos++;
		if(p->data==item)
		{
			break;
		}
		p=p->next;
	}
	if(p)
	{
		return pos;
	}
	else
	{
		return 0;
	}
}

七、获取单链表上指定的元素

int Find_pos(Node *H,int pos,DataType *item)
{
	Node *p=H->next;
	int i=1;
	while(p&&i!=pos)		//判断插入查找是否有效
	{
		i++;
		p=p->next;
	}
	if(p==NULL)
	{
		cout<<"位置无效"<<endl;
	}
	else
	{
		*item=p->data;
	}
	return 1;
}

八、单链表的建立
A.链表表头插入法建立单链表

void CreateListF(Node *&H,DataType a[],int n)
{
	for(int i=0;i<n;i++)
	{
		Node *t=new Node;
		t->data=a[i];
		t->next=H->next;
		H->next=t;
	}
}

B.尾插法建表

void CreateListR(Node *&H,DataType a[],int n)
{
	int i;
	Node *r=H;
	while(r->next)		//找到尾7结点
	{
		r=r->next;
	}
	for(int i=0;i<n;i++)
	{
		Node *t=new Node;
		t->data=a[i];
		r->next=t;		//连接
		r=t;			//指针r移动到尾结点
	}
}

C.链表任意位置插入法建立单链表(必须找到所插位置的前一个结点,再进行插入)

int ListInsert(Node *&H,int pos,DataType item)
{
	Node *p=H;
	int pos=1;
	while(p)
	{
		if(i==pos)
		{
			break;
		}
		p=p->next;
	}
	if(p==NULL)
	{
		cout<<"插入位置无效!"<<endl;
		return 0;
	}
	Node *t=new Node;
	t->data=item;
	t->next=p->next;
	p-next=t;
	
	return 1;
}

九、从单链表中删除指定位置的结点

int ListDelete_pos(Node *&H,int pos,DataType *item)
{
	Node *p=H;
	Node *t=new Node;
	int i=1;
	
	while(p)
	{
		if(i==pos)
		{
			break;
		}
		p=p->next;
	}
	if(p==NULL)
	{
		cout<<"删除位置无效"<<endl
		return 0;
	}
	t=p->next;
	item=t->data;
	p->next=t->next;
	delete t;
	
	return 1;
}

十、从线性表中删除一个与指定值匹配的元素

int ListDelete_item(Node *&H,DataType item)
{
	Node *p=H;
	Node *t;
	while(p->next)
	{
		if(p->next->data==item)
		{
			break;
		}
		p=p->next;
	}
	if(p->next==NULL)
	{
		cout<<"删除元素不存在!"<<endl;
		return 0;
	}
	t=p->next;
	p->next=t->next;
	delete t;
	
	return 1;
}

十一、撤销单链表

void Destroy(Node *&H)
{
	Node *p		//借助一个指针指向链表中的元素进行删除
	while(H)
	{
		p=H;
		H=H->next;		//从开头一个一个删除,每删除一个链表头指针就往后一个位置
		delete p;
	}
}

▲循环链表(链表中的最后一个结点指向头结点)

单链表循环链表
判表空head->next=NULLhead->next=head
判表尾p->next=NULLp->next=head
建空表head->next=NULLhead->next=head
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值