数据结构之链表学习(2)

主要学习了链表的三个函数:插入节点,删除节点,排序。

(1)插入节点函数

    1、传递的参数

       参数主要有三个,链表的头结点Head,要插入的位置pos,要插入的元素的值val。

    2、此函数的执行循序

       首先,定义一个结构体指针变量p,方便后面的操作。然后一段代码

       while(p->pnext!= NULL && i < pos -1)
      {
        p = p->pnext;
        ++ i;
      }

      的作用是将p指向要插入节点的前一个节点。假设要在第4个节点前面插入一个节点,则此代码会使p指向第三个节点。

      

     

      然后利用if(p->pnext == NULL || i > pos -1)
              return false;

      来判断,如果不满足上面的要求就返回false。然后申请两个节点,一个是指向当前p的下一个节点,而另一个就是需要插入的节点。

         

      最后将它们连接起来p->pnext = pNew;pNew->pnext = q;

(2)删除节点函数

   删除节点函数的前一部分跟插入节点函数基本心相同。然后将删除节点的后一节点的地址付给删除节点的前一节点的pnext,即p->pnext = p->pnext->pnext;

(3)排序节点元素

   利用的方法是:将一个元素与它后面的所有元素进行比较找出最大值。

(4)链表完整的代码:

   

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct node
{
    int data;//数据域
    struct node *pnext;//指针域
}Node, *pNode;

/**创建链表**/
pNode Create_node(void)
{
    pNode Head, p1, p2;
    int val,num,i;
    Head = (pNode)malloc(sizeof(Node));//p=(struct node *)malloc(sizeof(struct node))
    Head->pnext = NULL;
    if(Head == NULL)
    {
        printf("内存分配失败,程序终止");
        exit(-1);
    }
    //
    p2 = Head;
    printf("请输入创建节点的个数:");
    scanf("%d",&num);
    for(i = 0; i < num; i ++)
    {
        printf("请输入节点的值:");
        scanf("%d",&val);
        p1 = (pNode) malloc(sizeof(Node));
        p1->pnext = NULL;
        p1->data = val;

        p2->pnext = p1;
        p2 = p1;
    }

    return Head;
}

/**遍历链表**/
void traverse_list(pNode Head)
{
    pNode p1;
    if(Head->pnext == NULL);
       // return;
    else
    {

         p1 = Head->pnext;//注意此处不是p1 = Head,而是p1 = Head->pnext
         printf("遍历后输出的值为:");
         while(1)
         {
            if(p1->pnext == NULL)
            {
                printf("%d ",p1->data);
                break;
            }
            printf("%d ",p1->data);
            p1 = p1->pnext;
         }
         printf("\n");
    }

}
/**判断链表是否为空**/
bool is_empty(pNode Head)
{
    if(Head->pnext == NULL)
    {
        //printf("该链表为空");
        return true;
    }

    //printf("该链表不为空");
    return false;
}

/**求链表的长度**/
int length_list(pNode Head)
{
    int i = 0;
    pNode p1;
    if(is_empty(Head))
        printf("该链表为空\n");
    else
    {
        p1 = Head->pnext;
        while(1)
        {
            if(p1->pnext == NULL)
            {
                i ++;
                break;
            }
            i ++;
            p1 = p1->pnext;
        }
     }
    //printf("链表的长度为:%d\n",i);
    return i;
}
/**插入元素**/
bool insert_list(pNode Head, int pos, int val)
{
    int i = 0;
    pNode p;
    p = Head;
    while(p->pnext!= NULL && i < pos -1)
    {
        p = p->pnext;
        ++ i;
    }//将p指向要插入节点位置的前一个节点

    if(p->pnext == NULL || i > pos -1)//i > pos -1的作用是当i取负值时的一种情况
        return false;

    pNode pNew = (pNode)malloc(sizeof(Node));
    if(pNew == NULL)
    {
        printf("动态内存分配失败");
        exit(-1);
    }
    pNew->data = val;
    pNew->pnext = NULL;

    pNode q = p->pnext;
    p->pnext = pNew;
    pNew->pnext = q;

    return true;
}

/**删除元素**/
bool delete_list(pNode Head, int pos, int * val)
{
    int i= 0;
    pNode p = Head;
    while(p->pnext != NULL && i < pos -1)
    {
        p = p->pnext;
        ++ i;
    }
    if(p->pnext == NULL || i > pos -1)
        return false;

    pNode q = p->pnext;
    *val = q->data;

    p->pnext = p->pnext->pnext;
    free(q);
    q = NULL;
    return true;
}
/**排序元素**/
void sort_list(pNode Head)
{
    int i, j, t;
    pNode p, q;
    int len = length_list(Head);
    for(i = 0, p = Head->pnext; i < len - 1; i ++, p = p->pnext)
        for(j = i + 1,q = p->pnext; j < len -1; j ++,q = q->pnext)
        {
            if(p->data > q->data)//如果p->data > q->data 就将两个数进行交换
            {
                t = p->data;
                p->data = q->data;
                q->data = t;
            }
            /*****************
            if(a[i] > a[j])
            {
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
            *****************/
        }
   return ;
}


int main(void)
{
    pNode pHead;
    int length,val;
    pHead = Create_node();
    traverse_list(pHead);
    length = length_list(pHead);
    printf("链表的长度为%d:\n",length);
    sort_list(pHead);//排序
    traverse_list(pHead);
    insert_list(pHead, 4, 33);
    traverse_list(pHead);
    delete_list(pHead, 4, &val);
    traverse_list(pHead);
}

  


  



    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值