单向链表的增删改查(包含头节点--头节点没有数据域)

#include "my_head.h"

typedef int ElemType_t;

//设计一个链表节点 结构体数据类型
typedef struct node{
	ElemType_t data;//数据域
	struct node *next;//指针域
}Node_t;

//创建一条只有头节点的链表并且初始化
Node_t *creat_head_list()
{
	//新建链表头节点--申请一个结构体Node_t的空间
	Node_t *head = malloc(sizeof(Node_t));
	if(head == NULL)
	{
		printf("malloc error!\n");
		return NULL;
	}
	
	//初始化
	head->next = NULL;//头节点没有数据域,只有指针域
	
	return head;
}
/*
函数作用;新建一个结点并且初始化
返回值:
		成功返回 新建结点的地址
		失败返回 NULL
*/

//尾插数据
void insert_list_tail(Node_t *head,ElemType_t inputData)
{
	//新建一个节点并初始化
	Node_t *newNode = malloc(sizeof(Node_t));
	if( newNode == NULL)
	{
		printf("malloc newNode error!\n");
	}
	
	newNode->data = inputData;
	newNode->next = NULL;
	
	//遍历链表,找到最后一个节点
	Node_t *p = NULL;
	for(p=head;p->next!=NULL;p=p->next);
	
	//将新节点插入链表尾部
	p->next = newNode;
	
	return;
}

//打印链表
void print_allNodeTolist(Node_t *head)
{
	//遍历链表
	Node_t *p = NULL;
	for(p=head->next;p!=NULL;p=p->next)
	{
		printf("%d\t",p->data);
	}
	printf("\n");
}

//新增一个数据,有序插入
Node_t *insert_nodeToList_sort(Node_t *head,ElemType_t addData)
{
	//新建一个节点,初始化
	Node_t *newNode = malloc(sizeof(Node_t));
	if(newNode == NULL)
	{
		printf("malloc error!\n");
		return head;
	}
	newNode->data = addData;
	
	//遍历链表,找到表中第一个比新节点数据大的节点和他前面那个节点
	Node_t *p = NULL;
	Node_t *q = NULL;
	for(p=head->next;p!=NULL;q=p,p=p->next)
	{
		if(p->data > addData)
			break;
	}	
	if(p == NULL)
	{
		q->next = newNode;
	}
	else
	{
		//第一个数据更改
		if( p == head->next)
		{
			newNode->next = head->next;
			head->next = newNode;
		}
		else//其他位置数据修改
		{
			q->next = newNode;
			newNode->next = p;
		}
	}
	
	return head;
}

//查询某个数据是否存在链表中
int find_node(Node_t *head, ElemType_t findData)
{
	Node_t *p = NULL;
	
	for(p=head->next;p!=NULL;p=p->next)
	{
		if(p->data == findData)
		{
			printf("find success is %d!\n",findData);
			return 1;
		}	
	}

	return -1;
	
}

//修改链表某个数据
Node_t *gedit_listData(Node_t *head,ElemType_t originData,ElemType_t newData)
{
	//看看链表中是否存在这个数据
	Node_t *p = NULL;
	if(find_node(p=head->next,newData))
	{
		printf("List have originData can gedit!\n");
	}
	else
	{
		printf("No newData!\n");
		printf("gedit error!\n");
	}
	
	//找到修改的数据,进行修改
	for(p=head->next;p!=NULL;p=p->next)
	{
		if(p->data == originData)
		{
			p->data = newData;
		}
	}
	
	return head;
}

//删除链表中的某一个数据
Node_t *delete_listData(Node_t *head,ElemType_t delData)
{
	//遍历链表找到你要删除的数据节点,记录当前删除节点和他上一个节点地址
	Node_t *p = NULL;
	Node_t *q = NULL;//记录删除节点的上一节点
	for(p=head->next;p!=NULL;q=p,p=p->next)
	{
		if(delData == p->data)
			break;
	}
	//如果找不到这个删除数据节点
	if(p == NULL)
	{
		printf("这个数据不存在!\n");
		return NULL;
	}
	//如果这个删除节点是第一个数据节点
	if( p == head->next )
	{
		head = p->next;
		free(p);
	}
	//如果是其他位置的删除节点
	else
	{
		q->next = p->next;
		free(p);
	}
	return head;
}

//头插
Node_t *insert_list_head(Node_t *head,ElemType_t headaddData)
{
	Node_t *newNode = malloc(sizeof(Node_t));
	if( newNode == NULL)
	{
		printf("malloc newNode error!\n");
		return NULL;
	}
	
	newNode->data = headaddData;
	
	newNode->next = head->next;
	head->next = newNode;
	
	return head; 
}

//指定插入新数据在某个数据位置之前
Node_t *insert_nodeTolist(Node_t *head,ElemType_t listData,ElemType_t updateData)
{
	//1.新建一个新节点(申请一个结构体空间)
	Node_t *newNode = malloc(sizeof(Node_t));
	if(newNode == NULL)
	{
		printf("malloc newNode error!\n");
		return NULL;
	}
	newNode->data = updateData;
	newNode->next = NULL;
	//遍历链表,找到指定数据节点和他前一个数据节点
	Node_t *p = NULL;
	Node_t *q = NULL;//存放指定节点的前一个节点
	for(p=head->next;p!=NULL;q=p,p=p->next)
	{
		if(p->data == listData)
			break;
	}
	//找不到这个指定数据的节点
	if(p == NULL)
	{
		q->next = newNode;//在后面补上这个新的数据节点
	}
	//找到这个数据节点
	else
	{
		if(p == head->next)
		{
			newNode->next = head->next;
			head->next = newNode;
		}
		else
		{
			q->next = newNode;
			newNode->next = p;
		}
	}
	return head;
}

//销毁链表
void destroy_allNodeTolist(Node_t *head)
{
	Node_t *p = NULL;
	Node_t *q = NULL;
	for(p=q=head;p!=NULL;p=q)
	{
		q = p->next;
		free(p);
	}
}

int main(int argc,char *argv[])
{
	//创建一条链表
	Node_t *head = NULL;
	
	//定义初始化头节点
	head = creat_head_list();
	
	//尾插数据
	insert_list_tail(head,10);
	insert_list_tail(head,20);
	insert_list_tail(head,40);
	insert_list_tail(head,60);
	insert_list_tail(head,80);
	
	//打印链表
	print_allNodeTolist(head);
	
	//新增一个数据,有序插入
	head = insert_nodeToList_sort(head,50);
	
	//打印链表
	print_allNodeTolist(head);
	
	//查询某个数据是否存在链表中
	int ret = find_node(head,60);
	if(ret == 1)
		printf("该数据存在此链表中!\n");
	else
		printf("该数据不在此链表中!\n");
	
	//打印链表
	print_allNodeTolist(head);
	
	//修改链表某个数据
	head = gedit_listData(head,40,44);
	
	//打印链表
	print_allNodeTolist(head);
	
	//删除链表中的某一个数据
	head = delete_listData(head,20);
	
	//打印链表
	print_allNodeTolist(head);
	
	//头插
	head = insert_list_head(head,5);
	
	//打印链表
	print_allNodeTolist(head);
	
	//指定插入某个数据位置之前
	head = insert_nodeTolist(head,80,70);
	
	//打印链表
	print_allNodeTolist(head);
	
	//销毁链表
	destroy_allNodeTolist(head);
	
	//打印链表
	print_allNodeTolist(head);

	
	return 0;
}

 解析:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值