11.链表的增删改查的简单使用

#include "stdafx.h"
#include
#include
#include

//1.链表结点类型
struct node
{
	int          data;
	struct node* next;
};

//起别名
typedef struct node NODE;
//创建一个结点并返回结点首地址
NODE* CreateNode(int data);
//尾插法
bool addNode(NODE* head, int data);
//遍历
void print(NODE* head);
//查找第n个结点,并返回首地址,找不到返回NULL
NODE* findNode(NODE* head, int n);
//查找第一个值为val的结点,返回结点首地址,如果没有找到,返回NULL;
NODE* getNumPos(NODE* head, int val);
//插入一个结点到第n个结点后,新结点数据为data
bool insetNode(NODE* head, int n, int val);
//删除第N个结点
bool delNode(NODE* head, int n);

int _tmain(int argc, _TCHAR* argv[])
{
	//2.链表
	NODE* list = NULL;
	//制造链表头结点
	list = CreateNode(0);

	for (int i = 1; i <= 5; i++)
	{
		addNode(list, i);
	}
	
	insetNode(list, 5, 6);
	print(list);

	while (delNode(list, 1))
	{
		print(list);
	}
	printf("\n");
	
	if (insetNode(list,9,99))
	print(list);
	else printf("nothing!\n");
	if (NODE* h = getNumPos(list, 6))
		printf("%d\n", h->data);
	else printf("none!\n");
	
	system("pause");
	return 0;
}

//创建一个结点并返回结点首地址
struct node* CreateNode(int data)
{
	//新开内存
	NODE* pNew = (NODE*)malloc(sizeof(NODE));
	//赋值
	pNew->data = data;
	pNew->next = NULL;
	//返回
	return pNew;//pNew 在堆区创建 可以返回
}

//尾插法
bool addNode(NODE* head, int data)
{
	if (head == NULL)return false;
	while (head->next)
	{
		head = head->next;
	}
	head->next = CreateNode(data);
}

//遍历
void print(NODE* head)
{
	if (head == NULL)return;
	head = head->next;
	printf("list:");
	while (head)
	{
		Sleep(300);
		printf("%d ", head->data);
		head = head->next;
	}
	printf("\n");
}

//查找第n个结点,并返回首地址,找不到返回NULL
NODE* findNode(NODE* head, int n)
{
	//防御性编程
	if (n < 1)return NULL;
	head = head->next;//排除没有的头结点
	for (int i = 0; i < n - 1; i++)
	{
		if (head == NULL)return NULL;
		head = head->next;
	}
	return head;
}

//插入一个结点到第n个结点后,新结点数据为data
bool insetNode(NODE* head, int n, int val)
{
	NODE* pTmp = findNode(head, n);
	if (pTmp == NULL)return false;
	NODE* pNew = CreateNode(val);
	pNew->next = pTmp->next;
	pTmp->next = pNew;
	return true;
}

//查找第一个值为val的结点,返回结点首地址,如果没有找到,返回NULL;
NODE* getNumPos(NODE* head, int val)
{
	if (head == NULL)return false;
	while (head->next)
	{
		if (head->data == val)return head;
		head = head->next;
	}
	return NULL;
}

//删除第N个结点
bool delNode(NODE* head, int n)
{
	if (head == NULL || n < 1)return false;
	//找到要删除的结点,用pDel 指向,如果为NULL,函数结束
	NODE* pDel = findNode(head, n);
	if (pDel == NULL)return false;
	//找到要删除的前一个结点,pDelbf指向
	NODE* pDelbf = NULL;
	if (n == 1)
		pDelbf = head;
	else 
		pDelbf = findNode(head, n - 1);
	//要删除结点的前一个结点的next指针指向要删除结点的下一个结点
	pDelbf->next = pDel->next;
	//释放要删除的结点
	free(pDel);
	pDel = NULL;
	return true;
}

你可能感兴趣的:(11.链表的增删改查的简单使用)