链表的基本操作

内容包括链表的创建,增加、删除节点,链表的逆序、排序和销毁等。

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
	int data;
	node* pNext;
}Node;

//链表的操作,以有头节点为例,无头节点类似
Node* head = NULL;

//创建链表,头结点data=0,pNext=NULL;
bool createNodeList()
{
	head = (Node*) malloc(sizeof(Node));
	if(NULL == head)
	{
		return false;
	}
	else
	{
		head->data = 0;
		head->pNext = NULL;
		return true;
	}
}

//增加节点
bool addNode(Node* node)
{
	if(NULL == head)
	{
		return false;
	}
	Node* p = head->pNext;
	Node* q = head;
	while(NULL != p)
	{
		q = p;
		p = p->pNext;
	}
	q->pNext = node;
	node->pNext = NULL;
	return true;	
}

//删除节点
bool deleteNode(int index)
{
	if(NULL == head)
	{
		return false;
	}
	Node* p = head->pNext;
	
	int length = 0;
	while(NULL != p)
	{
		length ++;
		p = p->pNext;
	}

	if(length < index)
	{
		return false;
	}
	else
	{
		Node* q = head;
		p = head;
		for(int i=0;i<index;i++)
		{
			q = p;
			p = p->pNext;
		}
		Node* t = p->pNext;
		q->pNext = t;
		free(p);
		return true;
	}
}

//逆序
void reverseNodeList()
{
	if(NULL == head)
	{
		return;
	}
	//如果链表长度为1
	if(head->pNext == NULL)
	{
		return;
	}
	Node* p = head->pNext;
	Node* q = p->pNext;
	Node* t = NULL;
	while(NULL != q)
	{
		t = q->pNext;
		q->pNext = p;
		p = q;
		q = t;
	}
	head->pNext->pNext = NULL;
	head->pNext = p;
}

//排序(降序)
void sort()
{
	//冒泡排序
	Node* pHead = head;
	if(head == NULL)
	{
		return;
	}
	if(pHead->pNext == NULL)
	{
		return;
	}
	Node* pi = pHead->pNext;
	Node* pj = pi->pNext;
	for(;pi != NULL;pi=pi->pNext)
	{
		for(pj = pi->pNext;pj != NULL;pj=pj->pNext)
		{
			if(pj->data>pi->data)
			{
				int tmp = pj->data;
				pj->data = pi->data;
				pi->data = tmp;
			}
		}
	}
}
//销毁
void destroyNodeList()
{
	if(NULL == head)
	{
		return;
	}
	if(NULL == head->pNext)
	{
		free(head);
		head = NULL;
		return;
	}
	Node* p = head->pNext;
	while(NULL != p)
	{
		Node* tmp = p;
		p = p->pNext;
		free(tmp);
	}
	free(head);
	head = NULL;
}

void main()
{
	createNodeList();

	Node* node1 = (Node*)malloc(sizeof(Node));
	node1->data = 1;
	node1->pNext = NULL;

	Node* node2 = (Node*)malloc(sizeof(Node));
	node2->data = 2;
	node2->pNext = NULL;

	addNode(node1);
	addNode(node2);

	reverseNodeList();

	Node* node3 = (Node*)malloc(sizeof(Node));
	node3->data = 3;
	node3->pNext = NULL;

	addNode(node3);

	sort();

	deleteNode(2);
	
	destroyNodeList();
}


### 使用CNN实现边缘检测的代码示例 对于基于卷积神经网络(CNN)的边缘检测,一种流行的方法是采用HED(Holistically-Nested Edge Detection)[^3]模型。下面是一个使用Python和TensorFlow框架实现该功能的例子。 #### 导入必要的库 ```python import tensorflow as tf from tensorflow.keras import layers, models import cv2 import numpy as np ``` #### 构建简单的CNN架构用于边缘检测 为了简化说明,这里展示了一个较为基础版本的CNN结构: ```python def create_cnn_model(): model = models.Sequential() # 卷积层1 model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=(None, None, 1))) model.add(layers.BatchNormalization()) model.add(layers.MaxPooling2D((2, 2))) # 更多卷层... # 实际应用中应增加更多层次并优化参数设置 return model ``` 此部分仅展示了最开始的一组卷积操作;实际项目里可能需要更复杂的配置以及额外的组件如跳跃连接等特性来增强性能[^5]。 #### 加载预训练权重与预测过程 假设已经有一个预先训练好的模型文件`hed_weights.h5`: ```python model = create_cnn_model() model.load_weights('path_to_pretrained_hed_weights.h5') # 对输入图像做处理 input_image = cv2.imread('image_path', cv2.IMREAD_GRAYSCALE) resized_img = cv2.resize(input_image, dsize=(desired_width, desired_height)) normalized_input = resized_img / 255.0 # 归一化至[0,1] # 扩展维度以适应Keras/TensorFlow的要求 expanded_input = np.expand_dims(normalized_input, axis=[0,-1]) prediction = model.predict(expanded_input) # 后处理得到最终边界图 edges = prediction.squeeze() * 255 final_edges = edges.astype(np.uint8) cv2.imwrite('output_edge_detection.png', final_edges) ``` 这段脚本首先定义了一个基本的CNN模型创建函数create_cnn_model(),接着加载了之前保存下来的权重数据,并对新传入的照片进行了尺寸调整、归一化等一系列准备工作之后送入网络获取输出结果。最后经过适当转换后保存为可视化的边缘图像[^2]。 #### 边缘连接和细化 在获得初步的边缘映射之后,还可以进一步运用形态学运算或其他技术手段来进行边缘链接和精炼工作,从而提升识别质量[^4]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值