C语言不带头结点链表创建,删除,插入总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011123091/article/details/82055404

一、创建链表

1、第一种创建链表的方法,注意对比和第二种创建链表的细微之处,

typedef struct mynode
{
        int num;
        float score;
        struct mynode * next;
}Node,* Pnode;
Pnode createList()
{
        Pnode head,currNode,tail;
        int num;
        float score;
        printf("input a number\n");
        scanf("%d",&num);
        head=NULL;
        tail=NULL;
        while(num!=0)
        {
                printf("input a score:\n");
                scanf("%f",&score);
                currNode=(Pnode)malloc(sizeof(Node));
                currNode->num=num;
                currNode->score=score;
                if(head==NULL) head=currNode;
                if(tail!=NULL) tail->next=currNode;
                tail=currNode;
                printf("input a num:\n");
                scanf("%d",&num);
        }
        tail->next=NULL;
        return head;

}

2、第二种创建链表的方法

typedef struct mynode
{
        int num;
        float score;
        struct mynode * next;
}Node,* Pnode;
void createList(Pnode * node)
{
        Pnode currNode,tail;
        int num;
        float score;
        printf("input a number\n");
        scanf("%d",&num);
        head=NULL;
        tail=NULL;
        while(num!=0)
        {
                printf("input a score:\n");
                scanf("%f",&score);
                currNode=(Pnode)malloc(sizeof(Node));
                currNode->num=num;
                currNode->score=score;
                if(head==NULL) *head=currNode;//直接赋值
                if(tail!=NULL) tail->next=currNode;
                tail=currNode;
                printf("input a num:\n");
                scanf("%d",&num);
        }
        tail->next=NULL;
        return;

}

第一种与第二种的区别之处在于,第一种是通过返回头指针的方法,第二种是通过传递二级指针的方法,在函数体内直接给指针赋值的方法来做的。思考第一种方法通过传递一级指针可以吗?? 不可以的,具体可以看我博客中的C语言一级指针和二级指针的区别。

二、遍历指针比较简单就不记录了

三、插入指针以及删除指针

单向链表插入指针和删除指针的核心点就是找到要插入位置和删除指针位置的前一个指针,具体是因为我们要前一个指针的next然后执行插入或者删除操作。

插入链表的编程中的四种情况:

1、插入的链表为空

2、要插入的元素的位置在链表中找不到,比如上边我们新建立的链表,我们要按照num的顺序插入,假如之前的链表是按照num的顺序的。

3、插入的元素位于头

4、插入的元素位于中间的任意一个位置

删除链表元素的四种情况:

1、要删除的元素找不到

2、要删除的元素在头部

3、要删除的元素位于中间的任何一个位置

4、要删除的链表为空,则不删除,直接退出.

下边编程实现,插入操作

Pnode insertNode(Pnode head,int num,float score)
{
        Pnode Prenode,Currnode=head;
        //新建节点
        Pnode Newnode=(Pnode)malloc(sizeof(Node));
        Newnode->num=num;
        Newnode->score=score;
        if(head==NULL)//第一种情况
        {
                head=Newnode;
        }else//第2,3,4中情况需要查找,这里就是出现的难点,要记录要插入的前一个节点      
        {
                while(Currnode!=NULL && Currnode->num<num)
                {
                        Prenode=Currnode;//前一个指针
                        Currnode=Currnode->next;
                }
                //区分找没找到
                if(Currnode==NULL)
                {
                        //没找到插入最后一个
                        Prenode->next=Newnode;
                        Newnode->next=NULL;
                }else
                {
                        //找到了
                        if(head==Currnode)
                        {
                                head=Newnode;
                        }else
                        {
                                Prenode->next=Newnode;
                        }
                        Newnode->next=Currnode;

                }

        }
        return head;
}

测试效果,成功插入

 测试代码下载

猜你喜欢

转载自blog.csdn.net/u011123091/article/details/82055404