单链表的PushBack,PopBack,Insert...函数

单链表的熟悉使用,注意测试用例的全面

//使用引用的作用等同于使用二级指针,在传递指针时
//传引用是可能改变Link,而有的函数只需改变->next,此时不需传引用
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<assert.h>
typedef int  DataType;
typedef struct LinkNode
{
	DataType  _data;//节点数据
	struct   LinkNode* _next;//指向下一个节点的指针
}LinkNode, *PLinkNode;
void  InitList(PLinkNode& PLinkhead);//初始化
void  PrintList(PLinkNode PLinkhead);//打印
int  GetLinkNode(PLinkNode PLinkhead);//获取节点数
void DestoryNode(PLinkNode& PLinkhead);//销毁链表
void  PushBack(PLinkNode& PLinkhead, DataType x);//尾插
void  PopBack(PLinkNode& PLinkhead);//尾删
void  PushFront(PLinkNode& PLinkhead, DataType x);//头插
void  PopFront(PLinkNode& PLinkhead);//头删
PLinkNode Find(PLinkNode PLinkhead, DataType x);//查找x的位置
void  Erase(PLinkNode& PLinkhead, PLinkNode pos);//删除pos处的节点
void  EraseNoTaiNode(PLinkNode  pos);//无头指针删除,可采用拷贝下一个结点数据,删除下一个结点
void  Insert(PLinkNode pos, DataType x);//在pos后面插入一个节点
void  Remove(PLinkNode& PLinkhead, DataType x);//删除链表中的第一个x
void  RemoveAll(PLinkNode& PLinkhead, DataType x);//删除链表中所有的x
void  Test();//测试
PLinkNode  BuyNode(DataType x);//开辟PLinkNode空间存储x

PLinkNode  BuyNode(DataType x)
{
	PLinkNode tmp;
	tmp=(PLinkNode)malloc(sizeof(LinkNode));
	tmp->_data = x;
	tmp->_next = NULL;
	return  tmp;
}
void  InitList(PLinkNode& PLinkhead)
{
	PLinkhead = NULL;
}
void  PrintList(PLinkNode PLinkhead)
{
	PLinkNode cur=PLinkhead;
	while (cur != NULL)
	{
		printf("%d->", cur->_data);
		cur = cur->_next;
	}
	printf("NULL\n");
}
int  GetLinkNode(PLinkNode PLinkhead)
{
	int count = 0;
	PLinkNode cur = PLinkhead;
	while (cur != NULL)
	{
		count++;
		cur = cur->_next;
	}
	return count;
}
void DestoryNode(PLinkNode& PLinkhead)
{
	PLinkNode del = PLinkhead;
	while (PLinkhead!= NULL)
	{
		del = PLinkhead;
        PLinkhead = PLinkhead->_next;
	    free(del);
	}
}
void  PushBack(PLinkNode& PLinkhead, DataType x)
{
	if (PLinkhead == NULL)
	{
		PLinkhead = BuyNode(x);
	}
	else
	{
		PLinkNode end =PLinkhead;
		while (end->_next != NULL)
		{
			end = end->_next;
		}
		end->_next = BuyNode(x);
	} 
}
void  PopBack(PLinkNode& PLinkhead)
{
	if (PLinkhead == NULL)
	{
		return;
	}
	else if (PLinkhead->_next == NULL)
	{
		free(PLinkhead);
		PLinkhead = NULL;
	}
	else
	{
		PLinkNode end=PLinkhead,pre=NULL;
		while (end->_next != NULL)
		{
			pre = end;
			end = end->_next;
		}
		pre->_next = NULL;
		free(end);
	}
}
void  PushFront(PLinkNode& PLinkhead, DataType x)
{
	if (PLinkhead == NULL)
	{
		PLinkhead = BuyNode(x);
	}
	else
	{
		PLinkNode start = BuyNode(x);
		start->_next = PLinkhead;
		PLinkhead = start;
	}
}
void  PopFront(PLinkNode& PLinkhead)
{
	if (PLinkhead == NULL)
	{
		return;
	}
	else if (PLinkhead->_next == NULL)
	{
		free(PLinkhead);
		PLinkhead = NULL;
	}
	else
	{
		PLinkNode end = PLinkhead;
		PLinkhead = PLinkhead->_next;
		free(end);
	}
}
PLinkNode Find(PLinkNode PLinkhead, DataType x)
{
	PLinkNode  cur = PLinkhead;
	while (cur)
	{
		if (cur->_data == x)
			return cur;
		else
			cur = cur->_next;
	}
	return NULL;
}
void  Erase(PLinkNode& PLinkhead, PLinkNode pos)
{
	assert(pos);
	PLinkNode  pre = PLinkhead;
	assert(pos);
	if (pos == PLinkhead)
	{
		PLinkhead = pos->_next;
		free(pos);
	}
	else
	{
		while (pre&&pre->_next != pos)
		{
			pre = pre->_next;
		}
		if (pre)
		{
			pre->_next = pos->_next;
			free(pos);
		}
		else
			printf("为找到此位置\n");
	}

}
void  EraseNoTaiNode(PLinkNode pos)//删除一个非尾节点的无头节点
{
	PLinkNode del = pos->_next;//保存pos的下一节点
	pos->_data = pos->_next->_data;
	pos->_next = del->_next;
	free(del);
}
void  Insert(PLinkNode pos, DataType x)//在pos后面插入x
{
	PLinkNode cur = BuyNode(x);
	if (pos == NULL)
	{
		printf("插入位置错误\n");
		return;
	}
	cur->_next = pos->_next;
	pos->_next = cur;
}
void  Remove(PLinkNode& PLinkhead, DataType x)
{
	PLinkNode  cur = PLinkhead,pre=NULL;
	if (PLinkhead->_data == x)
	{
		PLinkhead=PLinkhead->_next;
		free(cur);
	}
	else
	{
		while (cur&&cur->_data != x)
		{
			pre = cur;
			cur = cur->_next;
		}
		if (cur)
		{
			pre->_next= cur->_next;
			free(cur->_next);
		}
	}
}
void  RemoveAll(PLinkNode& PLinkhead, DataType x)
{
	PLinkNode cur = PLinkhead, pre = NULL;
	if (cur->_data == x)
	{
		PLinkhead = PLinkhead->_next;
		free(cur);
	}
	cur = PLinkhead;
	while (1)
	{
		while (cur&&cur->_data != x)
		{
			pre = cur;
			cur = cur->_next;
		}
		if (cur)
		{
			pre->_next = cur->_next;
			free(cur);
			cur = pre->_next;
		}
	    else
		    return;
	 }

}

void  Test()
{
	PLinkNode Link;
	InitList(Link);
	PushBack(Link,3);
	PushBack(Link, 2);
	PushBack(Link, 3);
	PushBack(Link, 4);
	PrintList(Link);

	PushFront(Link, 5);
	PushFront(Link, 6);
	PushFront(Link, 7);
	PrintList(Link);

	EraseNoTaiNode(Find(Link, 2));
	PrintList(Link);

	Insert(Find(Link, 2), 5);
	PrintList(Link);
	Insert(Find(Link, 3), 5);
	PrintList(Link);

	Remove(Link, 1);
	Remove(Link, 4);
	PrintList(Link);

	RemoveAll(Link, 3);
	PrintList(Link);

	DestoryNode(Link);
	PrintList(Link);

}

int main()
{
	Test();
	system("pause");
	return 0;
}
时间: 2024-10-12 22:06:20

单链表的PushBack,PopBack,Insert...函数的相关文章

单链表的操作和指针函数基础

/* ============================================================================ Name : TestLinkedList.c Author : lf Version : Copyright : Your copyright notice Description : 1 单链表的增删改查等操作 2 指针函数的使用.如示例中的:void (*visit)(link) ==========================

再谈单链表

#pragma once #include<stdio.h> #include<string.h> #include<assert.h> #include <stdlib.h> typedef int DataType; //定义一个结构体类型 typedef struct LinkNode { DataType data;//定义节点的数据 struct LinkNode *next;//保存下一个类型节点的地址 }LinkNode, *pLinkNode

对带头结点的单链表的简单操作

#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<memory.h> #define DataType int           //int 可以改写为其它数据类型 typedef struct Node { DataType data; struct Node *next; }Node,*pNode;          //定义结点结构体      

数据结构之——单链表

今天闲来无事,就打算把大一的时候写过的数据结构重温一遍,基本上我在大一之后只在单片机上用过几次顺序表和循环队列之外再就很少使用过数据结构了. 并且乘着写一下数据结构也可以熟悉熟悉vim. 首先定义单链表节点: 1 #define DataType int 2 3 struct node{ 4 DataType data; 5 struct node *next; 6 }; 7 struct node list,*p_list; 单链表这个数据结构需要一些函数来对她操作,一般需要有这些: 1.初始

1.3单链表的设计与实现

实现单链表的基本操作,包括链表的建立与释放,查找,求长度,查找后继,插入,删除,输出等函数. //调试环境:DevC++ //库文件和预设定义 #include <stdio.h> #include <stdlib.h> #define NULL 0 typedef int ElemType;//指定单链表中的数据类型 //单链表存储结构定义 typedef struct LNode { ElemType data;//数据域 struct LNode *next;//指针域 }L

c语言循环单链表

/************************************************************************* > File Name: singleLineTable.c > Author: zshh0604 > Mail: [email protected] > Created Time: 2014年10月15日 星期三 11时34分08秒 **************************************************

单链表删除节点

单链表删除节点 node *del(node *head, int num) { node *p1, *p2; p1 = head; while (num != p1->data && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (num == p1->data) { if (p1 == head) head = p1->next; else p2->next = p1->next; free(

c语言单链表实现

/************************************************************************* > File Name: singleLineTable.c > Author: zshh0604 > Mail: [email protected] > Created Time: 2014年10月15日 星期三 11时34分08秒 **************************************************

c语言有头循环单链表

/************************************************************************* > File Name: singleLineTable.c > Author: zshh0604 > Mail: [email protected] > Created Time: 2014年10月15日 星期三 11时34分08秒 **************************************************