C语言数据结构之单向链表(已经调试可以实现相应的功能了,可是还是有几个问题现在还是不大理解,希望大家能够一起探讨)

#include <stdio.h>
#include <stdlib.h>
typedef struct NodeStruct
{
    int num;
    struct NodeStruct *next;
}Node;
int Nodenum=0;
int IsEmpty(Node **headp)
{
    if(*headp==NULL||headp==NULL)
    {
        return 1 ;
    }
    else
    {
        return 0;
    }
}
int Nodenums()
{
    return Nodenum;
}
Node **CreateList(void)
{
    Node *head=NULL;
    Node *newpoint=NULL,*previewpoint=NULL;
    newpoint=(Node *)malloc(sizeof(Node));//开辟第一个节点
    printf("Please Input The num when -1 to exit:\n");
    scanf("%d",&newpoint->num);
    while(-1 != newpoint->num)
    {
        Nodenum++;
        if(1==Nodenum)
        {
            head=newpoint;
        }
        else
        {
            previewpoint->next=newpoint;
        }
        previewpoint=newpoint;//使得previewpoint指向当前链表的最后一个节点
        newpoint=(Node *)malloc(sizeof(Node));//newpoint指针又去开辟新的节点
        scanf("%d",&newpoint->num);           //输入数据
                                                                       //节点数加1
    }
    free(newpoint);                           //这个是num=-1的情况下的节点因为不符合条件所以要将它释放
    if(Nodenum!=0)                            //如果节点不止一个的话就在最末尾添加NULL
    {
        previewpoint->next=NULL;
    }
    return &head;                             //将链表头地址给一个指向指针的指针这样可以在以后更改头指针的值。
}


void display(const Node **headp)
{
    Node *point=*headp;
    if(IsEmpty(headp))
    {
        printf("No node to be display!\n"); //头指针值为0或者第一个指针值为0表示空链表
        return ;
    }else
    {
        printf("There are %d Nodes in The list\n",Nodenum);
        while(point!=NULL)                  //注意这里不是point->next否则最后一个无法显示
        {


            printf("%d\n",point->num);
            point=point->next;              //指针下移
        }
    }
}
void deleteList(Node **headp)
{
    Node *Point=NULL;
    Node *TobeDele=NULL;
    if(IsEmpty(headp))
    {
        printf("List empty,No Node to be delete!\n");
        return;
    }
    Point=TobeDele=*(headp);                 //指向第一个元素
    while(Point!=NULL)
    {
        Point=Point->next;
        *(headp)=Point;
        //printf("%d To be delete!\n",TobeDele->num);
        free(TobeDele);
        TobeDele=Point;
        Nodenum--;
    }
   *headp=NULL;
    headp=NULL;
}
Node *SearchNode(Node **headp,int TobeSeach)
{
    Node *point;
    int index=0;
    if(IsEmpty(headp))
    {
        return NULL;
    }
    else
    {
        point=*headp;
        index++;
        while((point!=NULL)&&(TobeSeach!=point->num))
        {
            index++;
            point=point->next;
        }
        //还有疑问就是如果下面的if语句删掉就进入死循环这是为什么?(未解决)
        if(point!=NULL)
        {
            printf("The node index you want to search is %d:\n",index);
        }
       return point;//如果没找到就放回point=NULL,否则找到的point


    }


}
int DeleNode(Node **headp,int num)
{
    Node *point;
    Node *preview;
    if(IsEmpty(headp))
    {
        return 0;
    }
    else
    {
        point=*(headp);
        preview=point;
        while(point!=NULL)
        {
            while((point->next!=NULL)&&(point->num!=num))
            {
                preview=point;
                point=point->next;
            }
            if(point->num==num)
            {
                if(point->next!=NULL)
                {
                    if(point==*(headp))
                    {
                        *headp=point->next;
                        free(point);
                        point=*(headp);
                        preview=point;
                    }
                    else
                    {
                        preview->next=point->next;
                        free(point);
                        point=preview->next;
                    }


                }else
                {
                    if(point==*(headp))
                    {
                        *(headp)=NULL;
                    }else
                    {
                        preview->next=NULL;
                    }
                    free(point);
                    Nodenum--;
                    break;
                }
                Nodenum--;
            }
            else if(point->next==NULL)
            {
                break;
            }
        }
        return 1;
    }
}
int InsertNode(Node **headp,int Nodeindex,int num)
{
    Node *point=NULL;
    Node *preview=NULL;
    int CurrentNodeNum;
    //int CurrentNodeNum=0; 上一句如果改为这句,也就是在这里初始化为0,为什么会导致判断headp为空链表(这个问题还没解决)
    if(IsEmpty(headp))
    {
        if(Nodeindex==0)
       {
              Node *mallocpoint=(Node *)malloc(sizeof(Node));//为什么这个在开头定义会使得headp自动更改
              mallocpoint->num=num;
              *headp=mallocpoint;
              mallocpoint->next=NULL;
              Nodenum++;
        }
        else
        {
            return 0;
        }
    }
    else
    {
        int CurrentNodeNum=0;
        point=*headp;
        CurrentNodeNum++;
        Node * mallocpoint=(Node *)malloc(sizeof(Node));//为什么这个在开头定义会使得headp自动更改
        mallocpoint->num=num;
        while((point->next!=NULL)&&(CurrentNodeNum!=Nodeindex))
        {
            preview=point;
            point=point->next;
            CurrentNodeNum++;
        }


        if(point->next==NULL)
        {
            point->next=mallocpoint;
            mallocpoint->next=NULL;
        }
        else
        {
            if(point==*headp)
            {
                mallocpoint->next=point;
                *headp=mallocpoint;
            }
            else
            {
                mallocpoint->next=point;
                preview->next=mallocpoint;
            }
        }
        Nodenum++;
        return 1;
    }
}
int main()
{
    Node **headp=NULL;
    Node *point=NULL;
    headp=CreateList();
    display(headp);
    InsertNode(headp,4,45);
    display(headp);
    point=SearchNode(headp,23);
    if(point!=NULL)
    {
        printf("%d\n",point->num);
    }
    else
    {
        printf("search failed!\n");
    }
    DeleNode(headp,45);
    display(headp);
    deleteList(headp);
    display(headp);
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值