关于链表一些方式的C语言实现

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

struct node
{
	int data;
	struct node* next;
};

//创造链表节点,返回链表节点所在指针,传入数据域和指针域 
struct node* creatnode(int data,struct node* next)
{
	struct node* p=malloc(sizeof(struct node));
	p->data=data;
	p->next=next;
	return p;
}

//给定一个链表头节点,判断链表是否为空链表 
int isempty(struct node* head)
{
	return head->next==NULL;
}

//给定一个链表节点,判断该节点是否为尾节点 
int islast(struct node* p)
{
	return p->next==NULL;
}

//给定一个链表头节点和一个数据,返回该数据在链表中第一次出现的位置指针,如果链表中不存在该数据,返回NULL 
struct node* findnode(struct node* head,int targetdata)
{
	struct node* move=head;
	while(!isempty(head)&&!islast(move))
	{
		if(move->next->data==targetdata) return move->next;
		move=move->next;
	}
	return NULL;
}

//给定一个单链表节点以及其前后节点指针,删除该链表节点 
void deletenode(struct node* front,struct node* position,struct node* after)
{
	front->next=after;
	free(position);
}

//给定一个单链表节点,传入链表头节点指针,目标数据X,删除方式deletemethod 
//删除链表中值为X的节点
//最后一个参数为0,为隐式删除,只删除第一个值为X的节点
//为1为显式删除,删除所有值为X的节点 
void deletenodeX(struct node* head,int X,int deletemethod) 
{
	struct node* move=head;
	if(deletemethod)
	{
		while(!isempty(head)&&!islast(move))
		{
			if(move->next->data==X)
			{
				deletenode(move,move->next,move->next->next);
			}
			else move=move->next;
		}
	}
	else
	{
		while(!isempty(head)&&!islast(move))
		{
			if(move->next->data==X)
			{
				deletenode(move,move->next,move->next->next);
				return;
			}
		}
	}
} 

//给定一个链表节点指针和一个数值X,在这个指针后面插入一个值为X的节点 
void insertnode(struct node* position,int X)
{
	struct node* temp=malloc(sizeof(struct node));
	temp->data=X;
	temp->next=position->next;
	position->next=temp;
}

//给定一个链表头节点,遍历打印链表全部元素 
void printnode(struct node* head)
{
	struct node* t=head;
	while(!islast(t))
	{
		printf("%d\t",t->next->data);
		t=t->next;
	}
}


int main(int argc, char *argv[])
{
	int temp;
	struct node* head=creatnode(0,NULL);
	struct node* move=head;
	while(scanf("%d",&temp)!=EOF)
	{
		insertnode(move,temp);
		move=move->next;
	}
	printnode(head);
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值