单链表的创建、插入删除和查询

适合初学者的代码
刚开始接触这个东西是感觉有点懵逼,但是学完之后,感觉其实就是把原来放在数组中的元素,变成放在一个链表中了,别的操作几乎相同。
头插法创建链在遍历时元素输出的顺序与原来输进去的元素的顺序是相反的,而尾插则是相同的。
例如输进去的是1 2 3 4 5。
头插遍历是:5 4 3 2 1。
尾插遍利是:1 2 3 4 5。
这是我写的代码希望对那些初学链表的兄弟姐妹们有帮助。

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

struct node
{
	int data;
	struct node *next;
 };
 typedef struct node *LinkList;
 
 void tcj(LinkList head,int n)//头插法创建
 {
 	LinkList p,t,q;
 	int i,a;
 	for(i=1;i<=n;i++)
 	{
 		p=(node *)malloc(sizeof(node));
 		scanf("%d",&a);
		p->data=a;
		p->next=head->next;
		head->next=p;
	 }
	 printf("\n");
 }
 
 void wcj(LinkList head,int n)//尾插法创建
 {
 	LinkList  p,rear=head;
 	int i,a;
 	for(i=1;i<=n;i++)
 	{
 		 p=(node *)malloc(sizeof(node));
		 scanf("%d",&a);
		 p->data=a;
		 rear->next=p;
		 rear=p;	
	}
	rear->next=NULL;
 }
 
 void insert(LinkList head,int a,int i)//插入 
 {
 	LinkList q,p=head,t;
 	
 	int j=1;
 	while(j<i)
 	{
 		p=p->next;
 		j++;
	 }
	 q=(node *)malloc(sizeof(node));
	 q->data=a;
	 q->next=p->next;
	 p->next=q;
	 //printf("******\n");
	 t=head->next;
	 while(t!=NULL)
	 {
	 	printf("%d ",t->data);
	 	t=t->next;
	 }
	 printf("\n");
 }
 
 void del(LinkList head,int i)//删除 
 {
 	LinkList q=head,p,t;
 	p=(node *)malloc(sizeof(node));
 	int j=1;
 	while(j<i)
 	{
 		q=q->next;
 		j++;
	 }
	 p=q->next;
	 q->next=p->next;
	 t=head->next;
	 while(t!=NULL)
	 {
	 	printf("%d ",t->data);
	 	t=t->next;
	 }
	 printf("\n");
 }
 
 void check(LinkList head,int a)//查询 
 {
 	LinkList t=head;
 	int flag=0;
 	while(t!=NULL)
 	{
 		if(t->data==a)
 			flag=1;
 		t=t->next;
	 }
	 if(flag==1)
	 	printf("有\n");
	else
		printf("无\n"); 
 }
 
 int main(void)
 {	
 	LinkList head;
	head=(node *)malloc(sizeof(node));
	head->next=NULL;
 	 int n,t,b,i;
 	 printf("头插法创建链表输1\n尾插发创建链表输2\n插入输3\n");
 	 printf("删除输4\n查询输5\n结束输0\n");
	 while(1)
	 {	
	 	scanf("%d",&t);
	 	if(t==1)
	 	{
	 		printf("输入链表长度\n");
		 	scanf("%d",&n);
		 	 tcj(head,n);
		}
		 
		if(t==2)
		{
			printf("输入链表长度\n");
		 	scanf("%d",&n);
		 	 wcj(head,n);	
		} 
		if(t==3)
		{
			printf("输入插入的元素及位置\n");
			scanf("%d%d",&b,&i);
		 	insert(head,b,i);
		}
		
		if(t==4)
		{
			printf("输入删除元素的位置\n"); 
			scanf("%d",&i);
			 del(head,i);
		}
		
		if(t==5)
		{
			printf("输入要查询的元素\n");
			scanf("%d",&b);
			check(head,b); 
		 } 
		 
		if(t==0)
			break;
	} 
	 return 0;
 }



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值