嵌入式学习——C语言基础(链表、段错误调试)——day15

1. 段错误调试

1.1 打印法

        在可能出现错误的位置加入打印,前一句能够打印出来,后一句打印不出来,问题就可以定位到两次打印中间的代码

1.2 gbd调试法

        1. 编译代码时加入-g选项

             gcc filename.c -g

        2. 使用gdb调试生成的代码

             gdb a.out

        3. gdb调试命令

                l                   查看代码
                b 函数名/行号        设置断点
                r                   运行代码
                n                   单步运行
                c                   直接运行到下一处断点
                s                   进入函数内部调试
                p   变量名          查看变量对应的值
                q                   退出

1.3 core文件调试方法

        1. 配置core文件

ubuntu 产生core文件-CSDN博客文章浏览阅读251次。ubuntu 产生core文件https://blog.csdn.net/weixin_43847267/article/details/130546569?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169243011316800225536999%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=169243011316800225536999&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-130546569-null-null.142%5Ev93%5EchatgptT3_2&utm_term=Ubuntu%E4%BA%A7%E7%94%9Fcore%E6%96%87%E4%BB%B6&spm=1018.2226.3001.4187        2. ulimit -c unlimited

        3. 编译代码加入-g选项

        4. 运行代码使其产生段错误,段错误产生后会生成一个包含错误信息的core文件

        5. gdb a.out core 找到错误产生的位置

        注意:打印法和gdb法可以调试任意错误,但core文件调试法只能调试段错误

2. 链表以及链表的增删改查程序

2.1 创建空链表

typedef struct node
{
    int data;
    struct node *pnext;
}linknode;

linknode *createlinklist(void)
{
    linknode *ptmpnode = NULL;

    ptmpnode = malloc(sizeof(linknode));
    if (NULL == ptmpnode)
    {
        printf("malloc failed!\n");
        return NULL;
    }

    ptmpnode->pnext = NULL;

    return ptmpnode;
}

2.2 头插法

int insertheadlinklist(linknode *phead, int tmpdata)
{
    linknode *ptmpnode = NULL;
    
    ptmpnode = malloc(sizeof(linknode));
    if (NULL == ptmpnode)
    {
        printf("malloc failed!\n");
        return -1;
    }

    ptmpnode->data = tmpdata;
    ptmpnode->pnext = phead->pnext;
    phead->pnext = ptmpnode;

    return 0;
}

2.3  打印链表信息

int showlinklist(linknode *phead)
{
    linknode *ptmpnode = NULL;

    ptmpnode = phead->pnext;
    while (ptmpnode != NULL)
    {
        printf("%d ", ptmpnode->data);
        ptmpnode = ptmpnode->pnext;
    }
    putchar('\n');

    return 0;
}

2.4 寻找链表中的元素

linknode *findlinklist(linknode *phead, int tmpdata)
{
    linknode *ptmpnode = NULL;

    ptmpnode = phead;
    while (ptmpnode != NULL)
    {
        if (tmpdata == ptmpnode->data)
        {
            return ptmpnode;
        }
        ptmpnode= ptmpnode->pnext;
    }

    return NULL;
}

2.5 链表元素的替换

int replacelinklist(linknode *phead, int olddata, int newdata)
{
    linknode *ptmpnode = NULL;

    ptmpnode = phead->pnext;
    while (ptmpnode != NULL)
    {
        if (olddata == ptmpnode->data)
        {
            ptmpnode->data = newdata;
        }
        ptmpnode = ptmpnode->pnext;
    }

    return 0;
}

2.6 尾插法

int inserttaillinklist(linknode *phead, int tmpdata)
{
    linknode *ptmpnode = NULL;
    linknode *plastnode = NULL;

    ptmpnode = malloc(sizeof(linknode));
    if (NULL == ptmpnode)
    {
        printf("malloc failed!\n");
        return -1;
    }

    ptmpnode->data = tmpdata;
    ptmpnode->pnext = NULL;

    plastnode = phead;
    while (plastnode->pnext != NULL)
    {
        plastnode = plastnode->pnext;
    }
    plastnode->pnext = ptmpnode;

    return 0;
}

2.7 链表中某个节点的删除

int deletelinklist(linknode *phead, int tmpdata)
{
    linknode *ptmpnode = NULL;
    linknode *pprenode = NULL;

    pprenode = phead;
    ptmpnode = phead->pnext;

    while (ptmpnode != NULL)
    {
        if (tmpdata == ptmpnode->data)
        {
            pprenode->pnext = ptmpnode->pnext;
            free(ptmpnode);
            ptmpnode = pprenode->pnext;
        }else
        {
            pprenode = pprenode->pnext;
            ptmpnode = ptmpnode->pnext;
        }
    }
    
    return 0;
}

2.8 链表的摧毁和回收

int destroylinklist(linknode **phead)//传入二级指针是为了对链表首地址的指针进行清空操作,操作指一般针用二级指针
{
    linknode *ptmpnode = NULL;
    linknode *pfreenode = NULL;

    ptmpnode = pfreenode = *phead;
    while (ptmpnode != NULL)
    {
        ptmpnode = ptmpnode->pnext;
        free(pfreenode);
        pfreenode = ptmpnode;
    }
    *phead = NULL;//上面的步骤清空了头结点之后的所有节点,最后将头结点的首地址变成空指针,完成链表的销毁

    return 0;
}

2.9 链表中元素的冒泡排序法

int bubblesortlinklist(linknode *phead)
{
    linknode *pend = NULL;
    linknode *pbefore = NULL;
    linknode *pafter = NULL;
    int tmp = 0;

    while (1)
    {
        pbefore = phead->pnext;
        pafter = phead->pnext->pnext;

        if (pend == pafter)
        {
            break;
        }

        while (pafter != pend)
        {
            if (pbefore->data < pafter->data)
            {
                tmp = pbefore->data;
                pbefore->data = pafter->data;
                pafter->data = tmp;
            }

            pafter = pafter->pnext;
            pbefore = pbefore->pnext;
        }
        pend = pbefore;
    }

    return 0;
}

2.10 链表中元素的选择排序法

int selectsortlinklist(linknode *phead)
{
    linknode *pbefore = NULL;
    linknode *pafter = NULL;
    linknode *pmin = NULL;
    int tmp = 0;
    
    pbefore = phead;

    while (1)
    {
        pbefore = pbefore->pnext;
        pmin = pbefore;
        pafter = pbefore->pnext;

        if (NULL == pafter)
        {
            return 0;
        }

        while (pafter != NULL)
        {
            if (pmin->data > pafter->data)
            {
                pmin = pafter;
            }
            pafter = pafter->pnext; 
        }
        if (pmin != pbefore)
        {
            tmp = pmin->data;
            pmin->data = pbefore->data;
            pbefore->data = tmp;
        }
    }

    return 0;
}

2.11 链表中元素的倒置

int invertlinklist(linknode *phead)
{
	linknode *ptmpnode = NULL;
	linknode *pinsertnode = NULL;

	ptmpnode = phead->pnext;
	phead->pnext = NULL;

	while (ptmpnode != NULL)
	{
		pinsertnode = ptmpnode;
		ptmpnode = ptmpnode->pnext;

		pinsertnode->pnext = phead->pnext;
		phead->pnext = pinsertnode;
	}

	return 0;
}

2.12 有关链表的总程序

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

typedef struct node
{
    int data;
    struct node *pnext;
}linknode;

linknode *createlinklist(void)
{
    linknode *ptmpnode = NULL;

    ptmpnode = malloc(sizeof(linknode));
    if (NULL == ptmpnode)
    {
        printf("malloc failed!\n");
        return NULL;
    }

    ptmpnode->pnext = NULL;

    return ptmpnode;
}

int insertheadlinklist(linknode *phead, int tmpdata)
{
    linknode *ptmpnode = NULL;
    
    ptmpnode = malloc(sizeof(linknode));
    if (NULL == ptmpnode)
    {
        printf("malloc failed!\n");
        return -1;
    }

    ptmpnode->data = tmpdata;
    ptmpnode->pnext = phead->pnext;
    phead->pnext = ptmpnode;

    return 0;
}

int showlinklist(linknode *phead)
{
    linknode *ptmpnode = NULL;

    ptmpnode = phead->pnext;
    while (ptmpnode != NULL)
    {
        printf("%d ", ptmpnode->data);
        ptmpnode = ptmpnode->pnext;
    }
    putchar('\n');

    return 0;
}

linknode *findlinklist(linknode *phead, int tmpdata)
{
    linknode *ptmpnode = NULL;

    ptmpnode = phead;
    while (ptmpnode != NULL)
    {
        if (tmpdata == ptmpnode->data)
        {
            return ptmpnode;
        }
        ptmpnode= ptmpnode->pnext;
    }

    return NULL;
}

int replacelinklist(linknode *phead, int olddata, int newdata)
{
    linknode *ptmpnode = NULL;

    ptmpnode = phead->pnext;
    while (ptmpnode != NULL)
    {
        if (olddata == ptmpnode->data)
        {
            ptmpnode->data = newdata;
        }
        ptmpnode = ptmpnode->pnext;
    }

    return 0;
}

int inserttaillinklist(linknode *phead, int tmpdata)
{
    linknode *ptmpnode = NULL;
    linknode *plastnode = NULL;

    ptmpnode = malloc(sizeof(linknode));
    if (NULL == ptmpnode)
    {
        printf("malloc failed!\n");
        return -1;
    }

    ptmpnode->data = tmpdata;
    ptmpnode->pnext = NULL;

    plastnode = phead;
    while (plastnode->pnext != NULL)
    {
        plastnode = plastnode->pnext;
    }
    plastnode->pnext = ptmpnode;

    return 0;
}

int deletelinklist(linknode *phead, int tmpdata)
{
    linknode *ptmpnode = NULL;
    linknode *pprenode = NULL;

    pprenode = phead;
    ptmpnode = phead->pnext;

    while (ptmpnode != NULL)
    {
        if (tmpdata == ptmpnode->data)
        {
            pprenode->pnext = ptmpnode->pnext;
            free(ptmpnode);
            ptmpnode = pprenode->pnext;
        }else
        {
            pprenode = pprenode->pnext;
            ptmpnode = ptmpnode->pnext;
        }
    }
    
    return 0;
}

int destroylinklist(linknode **phead)//传入二级指针是为了对链表首地址的指针进行清空操作,操作指一般针用二级指针
{
    linknode *ptmpnode = NULL;
    linknode *pfreenode = NULL;

    ptmpnode = pfreenode = *phead;
    while (ptmpnode != NULL)
    {
        ptmpnode = ptmpnode->pnext;
        free(pfreenode);
        pfreenode = ptmpnode;
    }
    *phead = NULL;//上面的步骤清空了头结点之后的所有节点,最后将头结点的首地址变成空指针,完成链表的销毁

    return 0;
}

int bubblesortlinklist(linknode *phead)
{
    linknode *pend = NULL;
    linknode *pbefore = NULL;
    linknode *pafter = NULL;
    int tmp = 0;

    while (1)
    {
        pbefore = phead->pnext;
        pafter = phead->pnext->pnext;

        if (pend == pafter)
        {
            break;
        }

        while (pafter != pend)
        {
            if (pbefore->data < pafter->data)
            {
                tmp = pbefore->data;
                pbefore->data = pafter->data;
                pafter->data = tmp;
            }

            pafter = pafter->pnext;
            pbefore = pbefore->pnext;
        }
        pend = pbefore;
    }

    return 0;
}

int selectsortlinklist(linknode *phead)
{
    linknode *pbefore = NULL;
    linknode *pafter = NULL;
    linknode *pmin = NULL;
    int tmp = 0;
    
    pbefore = phead;

    while (1)
    {
        pbefore = pbefore->pnext;
        pmin = pbefore;
        pafter = pbefore->pnext;

        if (NULL == pafter)
        {
            return 0;
        }

        while (pafter != NULL)
        {
            if (pmin->data > pafter->data)
            {
                pmin = pafter;
            }
            pafter = pafter->pnext; 
        }
        if (pmin != pbefore)
        {
            tmp = pmin->data;
            pmin->data = pbefore->data;
            pbefore->data = tmp;
        }
    }

    return 0;
}

int invertlinklist(linknode *phead)
{
	linknode *ptmpnode = NULL;
	linknode *pinsertnode = NULL;

	ptmpnode = phead->pnext;
	phead->pnext = NULL;

	while (ptmpnode != NULL)
	{
		pinsertnode = ptmpnode;
		ptmpnode = ptmpnode->pnext;

		pinsertnode->pnext = phead->pnext;
		phead->pnext = pinsertnode;
	}

	return 0;
}

int main(void)
{
    linknode *plinklist = NULL;
    linknode *ptmpnode = NULL;

    plinklist = createlinklist();

    insertheadlinklist(plinklist, 4);
    insertheadlinklist(plinklist, 3);
    insertheadlinklist(plinklist, 2);
    insertheadlinklist(plinklist, 1);
    showlinklist(plinklist);
    
    ptmpnode = findlinklist(plinklist, 3);
    if (ptmpnode != NULL)
    {
        printf("%p\n", &ptmpnode);
    }

    replacelinklist(plinklist, 4, 0);
    showlinklist(plinklist);

    inserttaillinklist(plinklist, 1);
    inserttaillinklist(plinklist, 2);
    inserttaillinklist(plinklist, 3);
    showlinklist(plinklist);

    deletelinklist(plinklist, 0);
    showlinklist(plinklist);

    bubblesortlinklist(plinklist);
    showlinklist(plinklist);

    selectsortlinklist(plinklist);
    showlinklist(plinklist);

    invertlinklist(plinklist);
    showlinklist(plinklist);

    destroylinklist(&plinklist);
    printf("plinklist %p\n", plinklist);

    return 0;
}

  • 30
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值