嵌入式开发–C语言基础13

学习目标:

嵌入式开发–C语言基础13


学习内容:

1.段错误调试
2.链表


学习时间:

2024年5月7日


学习产出:

1.段错误调试

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

方法二:gdb调试法
1.编译代码时加入-g选项

gcc filename.c -g

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

gdb a.out

3.gdb调试命令:

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

方法三:core文件调试法
1.配置core文件
参考该博客配置
2.ulimit -c unlimited
3.编译代码加入-g选项
gcc filename.c -o filename
4.运行代码使其产生段错误,段错误产生后会生成一个包含错误信息的core文件
5.gdb a.out core 找到错误产生的位置

2.链表

#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 *ptmp = NULL;

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

	return 0;
}

//寻找链表中的数据
linknode *findlinklist(linknode *phead, int tmpdata)
{
	linknode *ptmpnode = NULL;

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

//替换链表中的数据
int replacelinklist(linknode *phead, int oldata, int newdata)
{
	linknode *ptmpnode = NULL;

	ptmpnode = phead->pnext;
	while (ptmpnode != NULL)
	{
		if (ptmpnode->data == oldata)
		{
			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 (ptmpnode->data == tmpdata)
		{
			pprenode->pnext = ptmpnode->pnext;
			free(ptmpnode);
			ptmpnode = pprenode->pnext;
		}
		else 
		{
			ptmpnode = ptmpnode->pnext;
			pprenode = pprenode->pnext;
		}
	}

	return 0;
}

//全部删除
int destroylinklist(linknode **pphead)
{
	linknode *ptmpnode = NULL;
	linknode *pfreenode = NULL;

	ptmpnode = pfreenode = *pphead;
	while (ptmpnode != NULL)
	{
		ptmpnode = ptmpnode->pnext;
		free(pfreenode);
		pfreenode = ptmpnode;
	}
	*pphead = NULL;

	return 0;
}

//冒泡排序
int bubblesortlinklist(linknode *phead)
{
	linknode *ptmpnode1 = NULL;
	linknode *ptmpnode2 = NULL;
	linknode *pend = NULL;
	int tmp = 0;

	while (1)
	{
		ptmpnode1 = phead->pnext;
		ptmpnode2 = phead->pnext->pnext;
		
		if (ptmpnode2 == pend)
		{
			break;
		}

		while (ptmpnode2 != pend)
		{
			if (ptmpnode1->data > ptmpnode2->data)
			{
				tmp = ptmpnode1->data;
				ptmpnode1->data = ptmpnode2->data;
				ptmpnode2->data = tmp;
			}

			ptmpnode1 = ptmpnode1->pnext;
			ptmpnode2 = ptmpnode2->pnext;
		}

		pend = ptmpnode1;
	}
	return 0;
}

//选择排序
int selectsortlinklist(linknode *phead)
{
	linknode *pselectnode = NULL;
	linknode *pminnode = NULL;
	linknode *ptmpnode = NULL;
	int tmp;
	
	pselectnode = phead->pnext;
	while (pselectnode->pnext != NULL)
	{
		pminnode = pselectnode;
		ptmpnode = pselectnode->pnext;
		while (ptmpnode != NULL)
		{
			if (ptmpnode->data < pminnode->data)
			{
				pminnode = ptmpnode;
			}

			ptmpnode = ptmpnode->pnext;
		}
		if (pminnode != pselectnode)
		{
			tmp = pminnode->data;
			pminnode->data = pselectnode->data;
			pselectnode->data = tmp;
		}

		pselectnode = pselectnode->pnext;
	}

	return 0;
}

//主函数(随意操作)
int main(void)
{
	linknode *plinklist = NULL;
	linknode *ptmpnode = NULL;

	plinklist = createlinklist();
#if 1
	insertheadlinklist(plinklist, 1);
	insertheadlinklist(plinklist, 2);
	insertheadlinklist(plinklist, 3);
	insertheadlinklist(plinklist, 4);
#endif
	inserttaillinklist(plinklist, 5);
	inserttaillinklist(plinklist, 6);
	inserttaillinklist(plinklist, 7);
	inserttaillinklist(plinklist, 8);
	inserttaillinklist(plinklist, 1);
	inserttaillinklist(plinklist, 1);
	inserttaillinklist(plinklist, 2);
	inserttaillinklist(plinklist, 2);
	showlinklist(plinklist);
	
	ptmpnode = findlinklist(plinklist, 3);
	if (ptmpnode != NULL)
	{
		printf("%p, %d\n", ptmpnode, ptmpnode->data);
	}

	printf("-------------------\n");
	replacelinklist(plinklist, 3, 30);
	showlinklist(plinklist);
	
	deletelinklist(plinklist, 1);
	showlinklist(plinklist);
	
//	bubblesortlinklist(plinklist);
	selectsortlinklist(plinklist);
	showlinklist(plinklist);



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

	return 0;
}

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值