链表中常用的模块

链表中一些常用的模块简单分为以下几点:追加节点、插入头节点、查找结点、插入节点、删除结点、链表长度、打印所以结点。
准备数据

struct Data
{
 	char name[20];
 	char key[10];
 	int age;
};
typedef struct Node
{
	Data nodeData;
	struct Node*nextNode;
}CLType;

追加节点的操作步骤如下:
(1)首先分配内存空间,保存新增的结点。
(2)从头指针head开始逐个检查,直到找到最后一个节点、即表尾。
(3)将表尾的结点的地址设置为新增节点的地址。
(4)将新增节点的地址部分设置尾空地址NULL,即新增结点尾表尾。

CLType*CLAddEnd(CLType* head,Data nodeData) //追加节点
{
	CLType*node, *htemp;
	if(!(node=(CLType*)malloc(sizeof(CLType))))
	{
		printf("申请内存失败!\n");            //分配内存失败
		return NULL;
	}
	else
	{
		node->nodeData=nodeData;  //保存数据
		node->nextNode=NULL; //设置结点指针为空,即为表尾
		if(head==NULL)
		{
			haed=node;
			retrun head;
		}
		htemp=head;
		while(htemp->nextNode!=NULL)//查找链表的末尾
		{
			htemp=htemp->nextNode;
		}
		htemp->nextNode=mode;
		return head;
	}
}

插入头结点
(1)首先分配内存空间,保存新增结点。
(2)使新增结点指向头指针head所指向的结点。
(3)然后使头指针head指向新增结点。

CLType*CLAddFirst(CLType* head,Data nodeData)
{
	CLType* node;
	if(!(node=(CLType*)malloc(sizeof(CLType))))
	{
		printf("申请内存失败!\n");            //分配内存失败
		return NULL;
	}
	else
	{
		node->nodeData=nodeData;//保存数据
		node->nextNode=head;//指向头指针所指向的结点
		head=node;//头指针指向新增的结点
		return head;
	}
}

在这里head为头指针,输入参数nodeData为结点保存的数据。程序首先使用malloc函数申请保存结点数据的内存空间,如果分配成功,node中将保存指向该内存区域的指针。然后,将传入的nodeData保存到申请的内存区域,并使新增结点指向头指针head所指向的结点,最后设置头指针head重新指向新增的结点。

查找节点

CLType*CLFindNode(CLType* nhead,char* key)
{
	CLType* htemp;
	htemp=head;//保存链表头指针
	while(htemp)//若结点有效,则进行查找
	{
		if(strcmp(htemp->nodeData.key,key)==0)
		{
			return htemp;
		}
		htemp=htemp->nextNode;//处理下一结点
	}
	return NULL;
}

插入结点
(1)首先分配内存空间,保存新增结点。
(2)找到要插入结点的位置,也就是位于哪两个结点之间。
(3)修改插入位置结点的指针,使其指向新增结点,而使新增结点指向原插入位置所指向的结点。

CLType* CLInsertNode(CLType* head,char* findKey,Data nodeData)
{
	CLType* nide,*nodetemp;
	if(!(node=(CLType*)malloc(sizeof(CLType))))
	{
		printf("申请内存失败!\n");            //分配内存失败
		return NULL;
	}
	node->nodeData=nodeData;//保存数据
	nodetemp=CLFindNode(head,findkey);
	if(nodetemp)
	{
		node->nextNode=nodetemp->nextNode;
		nodetemp->nextNode=node;
	}
	else
	{
		printf("未找到正确的插入位置!\n");
		free(node);//释放内存
	}
	return head;//返回头指针
}

删除结点
(1)查找需要删除的结点。
(2)使前一结点指向当前结点的下一结点。
(3)删除结点。

int CLDeleteNode(CLType* head,char*key)
{
	CLType* node,*htemp;//node保存删除结点的前一结点
	htemp=head;
	node=head;
	while(htemp)
	{
		if(strcmp(htemp->nodeData.key,key)==0)
		{
			node->nextNode=htemp->nextNode;//使前一结点指向当前结点的下一结点
			free(htemp);//释放内存
			return 1;
		}
		else
		{
			node=htemp;//指向当前结点
			htemp=htemp->nextNode;//指向下一结点
		}
	}
	return 0;//未删除
}

计算链表长度

int CLLength(CLType* head)
{
	CLType* htemp;
	int len=0;
	htemp=head;
	while(htemp)
	{
		len++;
		htemp=htemp->nextNode;
	}
	return len;
}

显示所有结点

void CLAllNode(CLType* head)
{
	CLType* htemp;
	Data nodeData;
	htemp=head;
	printf("当前链表共有%d个结点。链表数据如下:\n",CLLength(head));
	while(htemp)
	{
		nodeData=htemp->nodeData;//获取结点数据
		printf("结点(%s,%s,%d)\n",nodeData.key,nodeData.name,nodeData.age);
		htemp=htemp->nextNode;//处理下一结点
	}
}

练练手

#include<iostream>
#include<algorithm>
using namespace std;
struct Node {
	int data;
	Node* next;
};
Node* creat() {
	Node* head, *p;
	head = new Node;
	p = head;
	int x,cycle = 1;
	while (cycle) {
		cin >> x;
		if (x) {
			Node* node = new Node;
			node->data = x;
			p->next = node;
			p = node;
		}
		else {
			cycle = 0;
		}
	}
	head = head->next;
	p->next = NULL;
	return head;
}
Node* InsertTailNode(Node* head, int data) {
	Node* node = new Node, *temp;
	node->data = data;
	node->next = NULL;
	if (head == NULL) {
		head = node;
		return node;
	}
	temp = head;
	while (temp->next) {
		temp = temp->next;
	}
	temp->next = node;
	return head;
}
Node* InsertHeadNode(Node* head, int data) {
	Node* node=new Node,*p;//动态申请插入节点内存,建立临时链表指针指向头节点。
	p = head;
	node->data = data;
	node->next = p;
	head = node;
	return head;
}
Node* FindNode(Node* head, int data) {
	if (head == NULL)return NULL;
	Node* node = head->next;
	while (node) {
		if (node->data == data) {
			return node;
		}
		node = node->next;
	}
	return NULL;
}
Node* InsertNode(Node* head, Node* node, int data) {
	Node* temp1, temp2;
	node->data = data;
	temp1 = FindNode(node, data);
	if (temp1) {
		node->next = temp1->next;
		temp1->next = node;
	}
	else {
		cout << "没有该节点";
		free(temp1);
	}
	return head;
}
int NodeLength(Node* head) {
	Node* temp = head;
	int count = 0;
	while (temp) {
		count++;
		temp = temp->next;
	}
	return count;
}
void PrintfNode(Node* head) {
	Node* temp = head;
	while (temp) {
		cout << temp->data << " ";
		temp = temp->next;
	}
}
int main() {
	Node* head = creat();
	head=InsertHeadNode(head, 9);
	head = InsertTailNode(head, 111);
	PrintfNode(head);
	cout << "链表长度" << endl;
	cout << NodeLength(head) << endl;
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值