您的位置:首页 > 理论基础 > 数据结构算法

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

2014-01-14 01:14 169 查看
主要学习了链表的三个函数:插入节点,删除节点,排序。

(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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: