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文件
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;
}