链表的增、删、改、查

链表的增、删、改、查

  1. linklist.c

    
    #include<stdio.h>
    #include<stdlib.h>
    #include"linklist.h"
    
    /*
    	功能:创建链表
    	返回值:链表的头指针
    */
    Node *create()
    {
        Node *first = NULL;						//给头、尾结点的地址初始值赋空值、因为还不存在
        Node *last = NULL;
        element x;								//输入的数据
        printf("请输入链表数据,以空格隔开,以0结尾。\n");
        while(1)
        {
            scanf("%d",&x);
            if(x == 0)							//输入0结束输入
            {
                break;
            }
            Node *p = (Node *)malloc(sizeof(Node));		//为新结点分配空间
            p->data = x;								//为新结点赋值
            p->next = NULL;
            //插入新结点,分情况讨论
            if(first == NULL)					//放在第一个位置
            {
                first = p;
                last = p;
            }
            else								//尾插法
            {
                last->next = p;
                last = p;
            }
        }
        return first;
    }
    
    /*
    	功能:打印链表
    	参数:@first:头指针
    */
    void *printflist(Node *first)
    {
        Node *p = first;
        while(p)
        {
    		printf("%d",p->data);
            p = p->next;
        }
        printf("\n");
        free(p);
    }
    
    /*
    	功能:在升序的链表中插入一个新结点,使链表依然升序
    	参数:@first:未插入前链表的头指针;@data:需要插入的数据
    	返回值:新链表的头结点
    */
    Node *insertlist(Node *first,element data)
    {
        Node *p = (Node *)malloc(sizeof(Node));
        p->data = data;
        p->next = NULL;
        Node *q = first;				//q保存第一个结点
        Node *r = NULL;					//r保存q前面的一个结点
        //找插入点
       	while(q)						
        {
            if(q->data > p->data)
            {
                break;
            }
            r = q;
            q = q->next;
        }
        //插入结点,分情况讨论
      	if(first == q)						//没有比新结点小的
        {
            p->next = q;
            first = p;
        }
        else if(q == NULL)					//没有比新结点大的
        {
            r->next = p;
            p->next = NULL;
        }
        else
        {
            r->next = p;
            p->next = q;
        }
        return first;
    }
    
    /*
    	功能:删除需要删除的数
    	参数:@first:链表的头指针;@data:需要删除的数
    	返回值:头结点
    */
    Node *deletelist(Node *first,element data)
    {
        while(1)
        {
            Node *q = first;
            Node *r = NULL;
            //找要删除的数
            while(q)
            {
                if(q->data == data)
                {
                    break;
                }
                r = q;
                q = q->next;
            }
            if(q == first)				//第一个结点待删除
            {
                first = q->next;		//头指针指向第二个结点
                q->next = NULL;			//q的下一个指向空,断掉
                free(q);
            }
            else if(q->next == NULL)	//最后一个结点待删除
            {
                r->next = NULL;			//最后一个结点指向空
                free(q);
            }
            else
            {
                r->next = q->next;
                q->next = NULL;
                free(q);
            }
        }
        return first;
    }
    /*
    	功能:修改链表中的某个数
    	参数:@first:头指针;@data:待修改的数;@x:修改成什么数
    */
    void *changelist(Node *first,element data,element x)
    {
        Node *q = first;
        Node *r = NULL;
        while(q)
        {
            if(q->data == data)
            {
                q->data = x;
            }
            r = q;
            q = q->next;
        }
        printf("链表中不存在要修改的数。\n")}
    /*
    	功能:查找链表中的某个数
    	参数:@first:头指针;@data:查找的数
    */
    void *findlist(Node *first,element data)
    {
        Node *q = first;
        while(q)
        {
            if(q->data == data)
            {
                printf("找到了%d\n",data);
            }
            q = q->next;
        }
        printf("链表中不存在%d\n",data);
    }
    
  2. main.c

    #include<stdio.h>
    #include"linklist.h"
    
    int main()
    {
        //1、创建链表
        Node *first = create();
        //2、打印链表
        printflist(first);
        //3、增
        element data1;
        printf("请输入要插入的数:\n");
        scanf("%d",&data1);
        first = insertlist(first,data1);
        printflist(first);
        //4、删
     	element data2;
        printf("请输入要插入的数:\n");
        scanf("%d",&data2);
        first = deletelist(first,data2);
        printflist(first);
        //5、改
        element data3,x;
        printf("请输入要修改的数:\n");
        scanf("%d",&data3);
        printf("请输入修改为的数:\n");
        scanf("%d",&x);
        first = changelist(first,data3,x);
        printflist(first);
        //6、查
        element data4;
        printf("请输入要查找的数:\n");
        scanf("%d",&data4);
        findlist(first,data4);
        return 0;
    }
    
    1. linklist.h

      #ifndef __LINKLIST_H__
      #define __LINKLIST_H__
      
      #define element int
      
      typedef struct node
      {
          element data;
          struct node *next;
      }Node;
      
      /*
      	功能:创建一个链表,输入0结束
      	返回值:头指针
      */
      Node *create();
      
      /*
      	功能:打印链表
      	参数:@first 头指针
      */
      void printflist(Node *first);
      
      /*
      	功能:
      		给升序的链表增加一个新的结点,使链表仍然升序
      	参数:
      		@first:
      			头指针
      		@data:
      			待插入的数据
      	返回值:
      		头指针
      */
      Node *insertlist(Node *first,element data);	
      
      /*
      	功能:删除需要删除的数
      	参数:@first:链表的头结点;@data:需要删除的数
      	返回值:头指针
      */
      Node *deletelist(Node *first,element data);
      
      /*
      	功能:修改链表中的某个数
      	参数:@first:头指针;@data:待修改的数;@x:修改成什么数
      */
      void *changelist(Node *first,element data,element x);
      
      /*
      	功能:查找链表中的某个数
      	参数:@first:头指针;@data:查找的数
      */
      void *findlist(Node *first,element data);
      
      #endif
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值