单链表插入和删除

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	int data;
	struct node *next;
}node,*link;
node * init_list()
{
	node * head;
	head = (node*)malloc(sizeof(node));
	head->next = NULL;
	return head;
}
link insert_tail()
{
	node * head, *rear;
	node *s;
	int data=0;
	head = rear = init_list();
	printf("输入-1表示输入结束:\n");
	
	while (1)
	{ 
		s = init_list();
		scanf("%d", &data);
		if (data == -1)
		{
			break;
		}
		else
		{
			s->data = data;
			s->next = rear->next;
			rear->next = s;
			rear = s;
		}
	}
	return head;
}
int find_list(link l, int data)//查找是否有该数据
{
	node *q;
	q = l->next;
	while (q!=NULL)
	{
		if (q->data == data)
		{
			printf("查找成功\n");
			return data;
		}
		else{
			printf("失败\n");
		}
	}
	return data;
}
void printf_list(link l)
{
	node * p;
	p = l;
	if (p == NULL)
	{
		return;
	}
	while (p->next)
	{
		p = p->next;
		printf("%d ", p->data);
	}
}

int findpos(link l, int data)//根据数据记录位置
{
	node *q;
	q = l;
	int i = 0;
	int p = 0;
	while (q ->next)
	{
		
		if (q->data == data)//if后面不加else return 否则只可以找到第一个数据
		{
			q = q->next;
			i++;
			p = i;
			printf("find:pos is:%d\n", p);
			return 1;
		}
		
	}
	printf("cant find!\n");
	return -1;
	
	}
node * find_pos(link l, int pos)//查找该位置的数据
{
	node * temp;
	int i = -1;//也可以等于0但对于后面插入或者删除第一个元素有影响
	temp = l;
	while (temp->next != NULL)
	{
		++i;
		temp = temp->next;
		if (i == pos)
		{
			
			printf("在该链表中找到了该位置的数据:%d\n", temp->data);
			//printf("%d\n", temp->data);
			return temp;
		}
	}
	printf("位置输入有误\n");
	return NULL;
}
link insert_pos(link l, int pos,int data)
{
	node *p=find_pos(l, pos-1);//pos-1是在数据之前插入,若是第一个则在后面插入
	                           //pos实在数据之后插入
	node *s;
	if (p == NULL)
	{
		printf("位置错误\n");
		return NULL;
	}
	else{
		s = init_list();
		s->data = data;
		s->next = p->next;
		p->next = s;
		return p;
	}

}
link del_pos(link l, int pos)
{
	node * tem = find_pos(l, pos-1);//pos-1删除的是pos的前一个元素
	                                //pos是删除pos的后一个元素
	                                //同样对第一个元素没用
	node *s;
	if (tem == NULL||tem->next==NULL)//保证链表不为空并且需要连接的下一个结点不为空
	{
		printf("位置错误\n");
		return NULL;
	}
	
	else{

		s = init_list();
		s = tem->next;
		tem->next = s->next;
		free(s);
		return tem;
	}
}
int main()
{
	link l;
	l = init_list();
	//l = insert_tail();
	//printf_list(l);	
	link c = init_list();
	c = insert_tail();
	//insert_pos(l,1,2);
	del_pos(c,2);
	printf_list(c);
	system("pause");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值