线性表--单链表(尾插法)

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
	int data;
    struct node*next;
}Snode;
Snode* creat()//创建头结点
{
	int n,i,x;
	Snode *s,*t;
    Snode *head; 
	head=(Snode*)malloc(sizeof(Snode));
	head->next=NULL;
	head->data=0;
	t=head;
	printf("请输入要插入的结点数:\n");
   scanf("%d",&n);
   if(n!=0)
   printf("请输入%d个结点数的值\n",n);
   for(i=0;i<n;i++)
   {
	  
      scanf("%d",&x);
      s=(Snode*)malloc(sizeof(Snode));
	  s->data=x;
	  s->next=t->next;
	  t->next=s;
	  t=s;
   }
   return head;

}
int lenth(Snode *l)//求链表的长度
{
    int len=0;
	Snode *s=l;
	while(s!=NULL)
	{
		len++;
		s=s->next;
	}
	return len;
}
Snode *get(Snode *l,int i)//取单链表表中第i个结点地址
{
  int len=0;
  Snode *s=l;
	while(s!=NULL&&len!=i)
	{
		len++;
		s=s->next;
	}
	return s;
}
void insnode(Snode *l,int i,int x)//把x的值插入到指定的位置i
{  
     Snode *s,*t;
    if(i<=lenth(l))
     {
         s=(Snode*)malloc(sizeof(Snode));
		 s->data=x;
		 t=get(l,i-1);
		 s->next=t->next;
		 t->next=s;
	 }
	 else printf("链表中没有第%d个位置\n",i);
}
void delnode(Snode *l,int i)//删除指定位置i的结点
{
  
	 Snode *s,*t;
     if(i<=lenth(l))
     {
		 t=get(l,i-1);
		 s=t->next;
		 t->next=s->next;
		 free(s);
	 }
	 else printf("链表中没有第%d个位置\n",i);
}


int locate(Snode *l,int x)//按值查找
{ 
   int flag=-1;
   Snode *s=l;
   while(s!=NULL)
	{
		if(s->data==x)
		{
			flag=1;
			break;
		}
		else s=s->next;
	}
   return flag;
}
void  display(Snode *l)//显示链表
{
     Snode *s=l->next;
	 while(s!=NULL)
	 {
       printf("%d ",s->data);
	   s=s->next;
	 }
	 printf("\n");
}
int  main()
{
	Snode *s;
	 int i,x;
	 char c;
	 while(1)
	 {
	 printf("************************\n");
	 printf("*                      *\n");
	 printf("*    1 链表初始化      *\n");
	 printf("*    2 链表指定插入    *\n");
	 printf("*    3 链表指定删除    *\n");
	 printf("*    4 链表按值查询    *\n");
	 printf("*    5 退出            *\n");
	 printf("************************\n");
	 c=getchar();
	 if(c=='5')break;
	 else
	 switch(c)
	 {
	  case '1':s=creat();;
            printf("初始化后的链表:\n");
	        display(s);
			break;

      case '2':printf("请输入要插入的位置和值\n");
	         scanf("%d%d",&i,&x);
	         insnode(s,i,x);
             printf("插入指定位置值后的链表:\n");
	         display(s);
			 break;
	  case '3':printf("请输入要删除的位置\n");
	         scanf("%d",&i);
			 delnode(s,i);
             printf("删除指定位置值后的链表:\n");
	         display(s);
			 break;

	  case '4':printf("请输入要按值查询的值\n");
	         scanf("%d",&x);
			 if(locate(s,x)!=-1)
				 printf("在链表中查到了\n");
			 else 
				 printf("没有查到\n");
			 break;
	
     }
	 getchar();
	}



	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值