链表的创建、取长、输出、插入、删除、逆序

本文详细介绍了一个简单的链表实现,包括创建、打印、插入、删除及逆序等基本操作,并提供了完整的C语言代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "stdio.h"

typedef struct node

{

         int data;

         struct node *next;

}link;

 

link * creatLink()

{

         link*p,*s,*head;

         head= (link*)malloc(sizeof(link));

         head->data= -1;

         p= head;

         intx;

         printf("inputx,separate by kongge,end with 0:");

         scanf("%d",&x);

         while(x!=0)

         {

                   s= (link*)malloc(sizeof(link));

                   s->data= x;

                   p->next= s;

                   p= s;

                   scanf("%d",&x);

         }

         p->next= NULL;

         return head;

}

 

int lengthofLink(const link * const head)//第一个const指向类型表示指向link指针,不能指其他类型,第二个const指向指针修饰指针表示head指向的地址不可变。

{

         if(head== NULL)

              return 0;

         intlen = 1;

         link* p;

         p= head->next;

         while(p!=NULL)

         {

              len+= 1;

              p= p->next;

         }

         return len;

}

 

void printLink(link * const head)

{

         if(head== NULL)

             return;

         link* p = head;

         while(p!=NULL)

         {

                   printf("%d\t",p->data);

                   p= p->next;

         }

         printf("\n");

}

 

link * insertLink(link *head,int num)

{

         link*p1,*p2,*p0;

         p0= (link *)malloc(sizeof(link));

         p0->data= num;

         p1= head ;

         while(num>p1->data&& p1->next !=NULL)

         {

                   p2= p1;

                   p1= p1->next;

         }

         if(num<=p1->data)

         {

                   if(p1==head)

                   {

                            p0->next=head;

                            head= p0;

                   }

                   else

                   {

                            p2->next= p0;

                            p0->next= p1;

                   }

         }

         else//num>所有现有数,插尾部

         {

                   p1->next= p0;

                   p0->next= NULL;

         }

   return (head);

}

 

link * del(link *head,int num)

{

         link*p1,*p2;

         p1= head;//->next ;

         while(num!=p1->data&&p1->next !=NULL)

         {

                   p2=p1;

                   p1= p1->next;

         }

         if(num== p1->data )

         {

                   if(p1==head)

                   {

                            head= p1->next;

                            free(p1);

                   }

                   else

                   {

                            p2->next=p1->next;

                            free(p1);

                   }

         }

         return head;

}

 

link * reverselink(link *head)//逆序

{

         link*p1,*p2,*p3;

         //判断是否为空,这几个函数都应该判断,head->next判断?

         if(head==NULL|| head->next ==NULL)

                   returnhead;

         p1= head;

         p2= p1->next;

         while(p2)

         {

                   p3= p2->next;

                   p2->next= p1;

                   p1= p2;

                   p2= p3;

         }

         head->next= NULL;

         head= p1;

         return head;

}

void main()

{

         link* head = creatLink();//建表

         printf("lenth:%d\n",lengthofLink(head));//表长

         printLink(head);//打印表

         intnum;

         printf("输入要插入的数字:");

         scanf("%d",&num);

         head= insertLink(head,num);//插入

         printLink(head);

         head= del(head,num);//删除

         printLink(head);

         head  = reverselink(head);//逆序

         printLink(head);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值