C语言单链表

C语言单链表

单向链表

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
	int data;
	struct node *next;
}st,*pt;

pt node_init(void);					//初始化节点
void add_head(pt head,int data);	//头插
void add_tail(pt head,int data);	//尾插
void del_node(pt head,int data);	//删除
void show(pt head);					//查看


int main(int argc, char const *argv[])
{
	int num;
	pt head = node_init();

	while(1)
	{
		printf("请输入:");
		scanf("%d",&num);while(getchar() != '\n');
		printf("──────────────────────────────\n");
		if(num > 0)
		{
			add_tail(head,num);		//输入正数则添加
		}
		else if(num < 0)
		{
			del_node(head,-num);	//输入负数则删除
		}
		else
			return 0;

		printf("──────────────────────────────\n");
		show(head);
		printf("──────────────────────────────\n");

	}
	return 0;
}


//初始化一个新节点
pt node_init(void)
{
	pt head = (pt)malloc(sizeof(st));
	if(head == NULL)
	{
		perror("init failed");
		return NULL;
	}
	head->next = NULL;
	return head;

}


//头插
void add_head(pt head,int data)
{
	pt new_node = node_init();
	if(new_node == NULL)
	{
		perror("new_node failed");
		return;
	}
	new_node->data = data;

	new_node->next = head->next;	//偷偷指向头节点下一个
	head->next = new_node;			//顺序不能换,否则链表断开
	printf("加入成功\n");

}


//尾插
void add_tail(pt head,int data)
{
	pt new_node = node_init();
	if(new_node == NULL)		//判断分配空间是否成功
	{
		perror("new_node failed");
		return;
	}
	new_node->data = data;		//数据给新节点
	new_node->next = NULL;		//指向空

	pt pos = head;
	while(pos->next != NULL)	//遍历到末尾
	{
		pos = pos->next;
	}

	pos->next = new_node;		//原末尾指针指向新节点
	printf("加入成功\n");

}


//删除
void del_node(pt head,int data)
{
	if(head->next == NULL)
	{
		printf("空链表\n");
		return;
	}
		
	int flag = 0;
	pt pos = head->next;
	pt pre = head;
	while(pos != NULL)			//循环遍历查找
	{
		if(data == pos->data)
		{	
			flag++;				//每找到一个,加一
			pre->next = pos->next;
			pos->next = NULL;
			free(pos);			//释放空间(只是释放空间,不是删除变量)
			pos = pre;			//重新指向一个位置

		}
		pre = pos;			
		pos = pos->next;
	}
	if(flag)
	{
		printf("已删除%d个\n", flag);
		return ;
	}
	else
	{
		printf("删除失败,无此数据\n");
		return ;
	}
}


//显示
void show(pt head)
{
	pt pos = head->next;
	while(pos != NULL)
	{
		printf("%d\n", pos->data);
		pos = pos->next;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值