欢迎光临散文网 会员登陆 & 注册

链表的创建与实现 bool delte(node* pHead, int del,int* val)

2021-11-17 21:49 作者:壹壹---  | 我要投稿

/*
    2021年11月17日20:49:52
    目的:链表的创建与实现
*/


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

typedef struct node
{
    int data;
    node* pNext;
};

node* inint();
void append(node*, int);
bool insert(node*, int, int);
bool delte(node*, int, int*);
void traverse(node*);
int length(node*);
void sort(node*);

int main(void)
{
    node* pHead = inint();
    append(pHead, 0);
    append(pHead, 1);
    append(pHead, 21);
    append(pHead, 12);
    append(pHead, 96);
    append(pHead, 54);
    
    traverse(pHead);
    
    insert(pHead, 2, 108);
    traverse(pHead);
    
    int val;
    if (delte(pHead, 3, &val))
        printf("链表取出成功,取出元素为%d\n", val);
    else
        printf("fail\n");
    
    sort(pHead);
    traverse(pHead);
    
    return 0;
}

node* inint()
{
    node* pHead = (node*)malloc(sizeof(node));
    pHead->pNext = NULL;
    return pHead;
}

void append(node* pHead, int val)
//要把元素新节点挂在最后一个结点的后面,
//就是要求得,最后一个结点,的地址,
//最后一个结点就是指针域为NULL的结点,当指针域为NULL时停止。
//那么p = pHead 是否需要pHead->pNext,
//不可以,否则p = p1,如果p1不存在,那么一直就挂不上去,
{
    node* p = pHead;
    while (NULL != p->pNext)
        p = p->pNext;
    node* pNew = (node*)malloc(sizeof(node));
    pNew->data = val;
    pNew->pNext = NULL;
    p->pNext = pNew;
    return;
}

void traverse(node* pHead)
{
    node* p = pHead->pNext;
    while (NULL != p)
    {
        printf("%d\t", p->data);
        p = p->pNext;
    }
    printf("\n");
    return;
}

bool insert(node* pHead, int ins, int val)
{
    int i = 0;
    node* p = pHead;
    // i = 0 , p = p0, i = 1,
    //可以得到,i = ins-2,
    //要理解,为啥,ins-2就是ins前面的一个结点.
    //i = 0,p0,n = 0, i = 1
    while (NULL != p && i < ins - 1)
    {
        p = p->pNext;
        i++;
    }
    
    if (NULL == p || i > ins - 1)
        return false;

    node* pNew = (node*)malloc(sizeof(node));
    pNew->pNext = p->pNext;
    pNew->data = val;
    p->pNext = pNew;
    return true;
}

bool delte(node* pHead, int del,int* val)
{
    int i = 0;
    node* p = pHead;
    //与ins相同得到的均是该位置前面的结点的位置,
    //不同之处在于,delte需要判断,该结点的指针域是否为NULL;
    //为啥在i =  del-2处为del-1位置的元素.
    //i = 0 时为p1?
    //del = 1 ,i = 0 , p = p0,
    //i = 0, p 0,i = n , p (n),
    //i = 0, p 0,i = n ,p(n),
    //del = 2,i <1,
    //i = del-1,停止运行,p(del-1);
    while (NULL != p->pNext && i < del- 1)//i = del-1,p = p(del-1)
    {
        p = p->pNext;// p
        i++;//i = del-2
    }

    if (NULL == p || i > del - 1)
        return false;

    node* pDel = p->pNext;
    *val = pDel->data;
    p->pNext = pDel->pNext;
    free(pDel);
    pDel = NULL;
    return true;
}

int length(node* pHead)
{
    int num = 0;//num = 0;
    node* p = pHead->pNext;//p = p0;
    while (NULL != p)//
    {
        p = p->pNext;
        num++;
    }
    printf("%d\n", num);
    return num;
}

void sort(node* pHead)
{
    int i, j;
    node* t1;
    node* t2;
    int len = length(pHead);
    //i = 0,那么为啥不是 t1 = p0;
    for(i = 0,t1 = pHead->pNext;i<len-1;i++,t1= t1->pNext)
        //i= 0,t1 = p1,
        // i = len-2,t1 = p(len-1),
        //i = len-1,t1 = p(len);//最后一个值.
        //与数组一样,下标为0,指向p1.
        for(j = 0,t2 = pHead->pNext;j<len-i-1;j++,t2 = t2->pNext)
            if (t2->data < t2->pNext->data)
            {
                int t = t2->pNext->data;
                t2->pNext->data = t2->data;
                t2->data = t;
            }
    return;

}

/*
    ————————————————————————————
    0       1       21      12      96      54
    0       108     1       21      12      96      54
    链表取出成功,取出元素为1
    6
    108     96      54      21      12      0
    ————————————————————————————
*/


感谢郝斌老师

链表的创建与实现 bool delte(node* pHead, int del,int* val)的评论 (共 条)

分享到微博请遵守国家法律