单链表(非通用链表)-C语言

myList.h头文件

#pragma once
//单链表的实现(C语言)
#define SUCCESS -1
#define ERROR     0
#define STATUS int
typedef struct node
{
	int data;
	struct node* next;
}NODE_T;

//创建链表头节点
NODE_T* createHead();

//头部添加节点
STATUS addToHead(NODE_T* head, NODE_T *newNode);

//尾部添加节点
STATUS addToTail(NODE_T* head, NODE_T *newNode);

//指定位置添加节点
STATUS addSpecify(NODE_T* head, NODE_T *newNode, int i);

//删除指定位置的元素
STATUS delSpecify(NODE_T* head, int i);

//删除指定元素
STATUS delElem(NODE_T* head, int data);

//查找指定位置元素
STATUS searchSpecify(NODE_T* head, int i, int *data);

//查找元素在链表中的位置
STATUS searchPosition(NODE_T* head,  int data);

//获取链表长度
STATUS getLength(NODE_T *head);

//清空链表
STATUS clearList(NODE_T *head);

//销毁链表
STATUS destroyList(NODE_T *head);

//遍历链表
void showList(NODE_T *head);

myList.cpp

```c
#include "myList.h"
#include <stdlib.h>
#include <stdio.h>
//创建链表头节点
NODE_T* createHead()
{
	NODE_T* head = (NODE_T*)malloc(sizeof(NODE_T));
	if (!head)
		return ERROR;
	head->data = 0;
	head->next = NULL;
	return head;
}

//头部添加节点
STATUS addToHead(NODE_T* head, NODE_T* newNode)
{
	head->data += 1;
	if (head->next)							/*链表不为空*/
	{
		newNode->next = head->next;
		head->next = newNode;
	}
	else {											/*链表为空*/
		head->next = newNode;
		newNode->next = NULL;
	}
	return SUCCESS;
}

//尾部添加节点
STATUS addToTail(NODE_T* head, NODE_T* newNode)
{
	head->data += 1;
	NODE_T* tmp = head;
	while (tmp->next)						/*单链表里常用的遍历方法*/
	{
		tmp = tmp->next;
	}
	tmp->next = newNode;
	newNode->next = NULL;
	return SUCCESS;
}

//指定位置添加节点
STATUS addSpecify(NODE_T* head, NODE_T* newNode, int i)
{
	if (i<0 || i>head->data)
	{
		printf("插入位置出错\n");
		return ERROR;
	}
	head->data += 1;
	NODE_T* tmp = head;
	int count = 0;
	while (tmp->next)
	{
		tmp = tmp->next;
		++count;
		if (count == i)
			break;
	}
	newNode->next = tmp->next;							/*添加新的节点*/
	tmp->next = newNode;
	return SUCCESS;
}

//删除指定位置的元素
STATUS delSpecify(NODE_T* head, int i)
{
	if (i<0 || i>head->data)
		return ERROR;
	NODE_T* tmp = head;
	int count = 0;
	while (tmp->next)
	{
		tmp = tmp->next;
		++count;
		if ((count+1) == i)
			break;
	}
	printf("被删除的元素:%d\n", tmp->next->data);
	tmp->next = tmp->next->next;                                  /*删除节点*/
	free(tmp->next);
	return SUCCESS;
}

//删除指定元素
STATUS delElem(NODE_T* head, int data)
{
	head->data -= 1;
	NODE_T* tmp = head;
	while (tmp->next)
	{
		tmp = tmp->next;
		if (tmp->next->data == data)
		{
			printf("被删除的元素:%d\n", tmp->next->data);
			tmp->next = tmp->next->next;
			free(tmp->next);
			break;
		}
	}
	return SUCCESS;
}

//查找指定位置元素
STATUS searchSpecify(NODE_T* head, int i, int* data)
{
	if (i<0 || i>head->data)
		return ERROR;
	NODE_T* tmp = head;
	int count = 0;
	while (tmp->next)
	{
		tmp = tmp->next;
		++count;
		if (count == i)
		{
			printf("第%d个元素是:%d\n", i, tmp->data);
			*data = tmp->data;
			break;
		}
	}
	return 0;
}

//查找元素在链表中的位置
STATUS searchPosition(NODE_T* head, int data)
{
	NODE_T* tmp = head;
	int count = 0;
	while (tmp->next)
	{
		tmp = tmp->next;
		++count;
		if (tmp->data == data)
		{
			printf("%d在链表里的位置:%d\n", data, count);
			return count;
		}
	}
	return ERROR;
}

//获取链表长度
STATUS getLength(NODE_T* head)
{
	return head->data;
}

//清空链表
STATUS clearList(NODE_T* head)
{
	NODE_T* tmp1 = head, *tmp2;				/*一个指向当前要删除的节点,另一个指向删除节点的下一个节点*/
	while (tmp1->next)
	{
		tmp1 = tmp1->next;
		tmp2 = tmp1->next->next;
		free(tmp1);
		tmp1 = tmp2;
	}
	return SUCCESS;
}

//销毁链表
STATUS destroyList(NODE_T* head)
{
	clearList(head);
	free(head);
	return 0;
}

//遍历链表
void showList(NODE_T* head)
{
	NODE_T* tmp = head;
	int count = 0;
	while (tmp->next)
	{
		tmp = tmp->next;
		++count;
		printf("链表第%d个元素是%d\n", count,tmp->data);
	}
}

测试main.cpp:

//main.cpp
#include "myList.h"
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{
	NODE_T* head = createHead();								   /*得到链表头节点*/
	NODE_T* node1 = (NODE_T*)malloc(sizeof(NODE_T));
	if (!node1)
		return -1;
	node1->data = 10;
	addToHead(head,node1);											/*链表头部添加一个节点*/
	NODE_T* node2 = (NODE_T*)malloc(sizeof(NODE_T));
	if (!node2)
		return -1;
	node2->data = 20;
	addSpecify(head, node2,1);											/*链表指定位置添加一个节点*/
	NODE_T* node3 = (NODE_T*)malloc(sizeof(NODE_T));
	if (!node3)
		return -1;
	node3->data = 30;
	addSpecify(head, node3, 2);										/*链表指定位置添加一个节点*/
	showList(head);															/*遍历链表*/
	int data = 0;
	searchSpecify(head, 3, &data);									/*查找链表里第三个元素的值*/
	searchPosition(head, 10);											/*查找数据10在链表里的位置*/
	return 0;
}

结果:
在这里插入图片描述

发布了12 篇原创文章 · 获赞 0 · 访问量 295

猜你喜欢

转载自blog.csdn.net/ASCE_S/article/details/104033715
今日推荐