【c语言之链表基础操作02】

c语言之链表基础操作

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int count = 0; //记录节点总个数
struct node
{
    
    
	int data;
	struct node *pnext;
};

//创建节点
struct node *create_node(int dat)
{
    
    
	struct node *p = (struct node *)malloc(sizeof(struct node *));
	//判断是否创建成功
	if(NULL == p)
	{
    
    
		printf("malloc error\n");
	}
	//清除
	memset(p,'\0',sizeof(struct node));
	//赋值
	p->data = dat;
	p->pnext = NULL;
	return p;
}

//带头结点
//尾部插入
void Insert_Tail(struct node *ph,struct node *new)
{
    
    
	//分两步
	//先找到最后一个节点
	
	struct node *p = ph;
	while(NULL != p->pnext)
	{
    
    
		p = p->pnext; //节点后移
		count++;
	}
	//将新节点插入最后一个节点后面
	p->pnext = new;
	ph->data = count+1;
}

//头插入
void Insert_Head(struct node *ph,struct node *new)
{
    
    

	//新节点的Next指向原来的第一个节点
	new->pnext = ph->pnext;
	//头节点的next指向新节点
	ph->pnext = new;
	//头节点计数加1
	ph->data = ++count;
}

//删除节点
//1.待删除的节点不是尾节点的情况:首先把待删除的节点的前一个节点的pnext指针指向待
//删除的节点的后一个节点的首地址,然后在将这个摘出来的节点free掉
//2.是尾节点的情况下:首先把删除的尾节点的前一个节点的Pnext指针指向null,
//这时候就相当于原来尾节点前面的一个节点变成了新的尾节点,然后将其摘出来的节点free掉。,
//找到并成功删除返回0 失败返回-1
int Delete_node(struct node *ph,int data)
{
    
    
	struct node *temp = ph;
	struct node *tempre = NULL;
	//找到这个待删除的节点
	while(NULL != temp->pnext)
	{
    
    
		tempre = temp;
		temp = temp ->pnext;
		if(temp->data == data)
		{
    
    
			//找到节点
			//1 普通节点  2.尾节点
			if(NULL == temp->pnext) //尾节点
			{
    
    
				tempre->pnext = NULL;//原来尾节点前一个变成新的尾节点
				free(temp); //释放原来尾节点
			}
			else //普通节点
			{
    
    
				tempre->pnext = temp->pnext;
				//要删除的节点的前一个节点和它的后一个节点关联起来
			}
			ph->data = count - 1; //节点数减一
			printf("节点 %d 删除成功\n",data);
			return 0;
		}
	}
	//没有找到节点
}

//查找节点
//找到了返回1 没有返回-1
struct node * Search_Node(struct node *ph,int dat)
{
    
    
	struct node *temp = ph;
	while(NULL != temp->pnext)
	{
    
    
		temp = temp->pnext;
		if(temp->data == dat)
		{
    
    
			//找到了
			printf("node value:%d find success\n",temp->data);
			return temp;
		}
	}
	printf("not find node \n");
	return NULL;
}
//修改节点
void mod_node(struct node *ph,int data,int new_data)
{
    
    
	struct node *temp = ph;
	struct node *p = NULL;
	p = Search_Node(temp,data);
	if(NULL != p)
	{
    
    
		p->data = new_data;
		printf("节点修改成功\n");
	}
	else
	{
    
    
		printf("节点修改失败\n");
	}
}

//带头结点节点打印
void Print_Node(struct node *ph)
{
    
    
	int i = 0;
	struct node *temp = ph;
	printf("--------------遍历节点--------------\n");
	printf("node num %d\n",ph->data);
	while(NULL != temp->pnext)
	{
    
    
		i++;
		printf("node %d = %d\n",i,temp->pnext->data);
		temp = temp->pnext;
	}
	printf("--------------遍历完成---------------\n");
}


//主函数
int main(void)
{
    
    
	//头结点
	//struct node *phead = NULL;
	struct node *phead = create_node(0);
	Insert_Head(phead,create_node(1));
	Insert_Head(phead,create_node(2));
	Insert_Head(phead,create_node(3));
	Insert_Head(phead,create_node(4));
	Insert_Head(phead,create_node(5));
	Insert_Head(phead,create_node(6));

	/*
	//创建第一个节点
	phead = create_node(1);
	phead->pnext = create_node(22);
	phead->pnext->pnext = create_node(34);
	*/
	/*
	printf("phead->data     = %d\n",phead->data);
	printf("phead->pnext->data  = %d\n",phead->pnext->data);
	printf("phead->pnext->pnext->data = %d\n",phead->pnext->pnext->data);
	*/
	Print_Node(phead);
	Delete_node(phead,3);
	Print_Node(phead);
	mod_node(phead,5,10);
	Print_Node(phead);
	Search_Node(phead,6);
	return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/boybs/article/details/122988116
今日推荐