一、一般调试
(1)gcc -g .c
(2)gdb a.out (可执行文件名)
(3)b fun.c :36 设置断点,运行到这个位置程序暂停。(b + 函数名)
(4)r 运行
(5)n 执行下一步
(6)使用p命令,查看变量或指针等数据。
(7)list,看源码
二、找段错误
1.gcc -g (加上调试选项 -g, eg: gcc main.c linklist.c -g)
2.gdb a.out (调试可执行文件, eg :gdb ./a.out)
3.按r(run)直接开始运行
4.where 找出段错误的位置
三、例题和练习
1.修改单向链表
int ModifyLinkList(LinkList *ll, char *name, DATATYPE *data)
{
DATATYPE *tmp = FindLinklist(ll, name);
if(NULL == ll)
{
return 1;
}
memcpy(tmp, data, sizeof(DATATYPE));
return 0;
}
2.单向链表 销毁函数
int DestroyLinkList(LinkList **ll)
{
LinkNode *tmp = (*ll)->head;
while(NULL != tmp)
{
(*ll)->head = tmp->next;
free(tmp);
tmp = (*ll)->head;
}
free(*ll);
*ll = NULL;
return 0;
}
3.找出单向链表中的中间数据
LinkNode *FindMiddleLinklist(LinkList *ll)
{
if(NULL == ll)
{
return NULL;
}
LinkNode *fast = ll->head;
LinkNode *slow = ll->head;
while(fast->next != NULL)
{
fast = fast->next;
if(fast->next != NULL)
{
fast = fast->next;
slow = slow->next;
}
}
return slow;
return slow;
}
4.找出倒数第k个数
LinkNode *FindReverseLinklist(LinkList *ll, int k)
{
if(k > ll->clen)
{
return NULL;
}
LinkNode *fast = ll->head;
LinkNode *slow = ll->head;
for(int i = 0; i < k; ++i)
{
fast = fast->next;
}
while(fast)
{
slow = slow->next;
fast = fast->next;
}
return slow;
}
5.逆序单向链表
int ReverseLinklist(LinkList *ll)
{
LinkNode *prev = ll->head;
LinkNode *tmp = ll->head->next;
LinkNode *Next = ll->head->next->next;
while(tmp)
{
tmp->next = prev;
prev = tmp;
tmp = Next;
if(tmp == NULL)
{
break;
}
Next = Next->next;
}
ll->head = prev;
return 1;
}
6.判断单向链表是否为环状
int IsRingLinkList(LinkList *ll)
{
LinkNode *fast = ll->head;
LinkNode *slow = ll->head;
while(fast->next)
{
fast = fast->next;
if(fast != slow)
{
slow = slow->next;
fast = fast->next;
}
if(fast == slow)
{
return 0;
}
}
return 1;
}
7.单向链表插入排序
LinkList *InsertSortLinkList(LinkList *ll)
{
LinkNode *pInsert = ll->head;
LinkNode *pTmp = pInsert->next;
LinkNode *Next = pTmp->next;
pTmp->next = NULL;
ll->head->next = NULL;
while(1)
{
pInsert = ll->head;
while(pInsert->next && pTmp->data.age > pInsert->data.age && pTmp->data.age > pInsert->next->data.age)
{
pInsert = pInsert->next;
}
if(pInsert->data.age > pTmp->data.age)
{
pTmp->next = ll->head;
ll->head = pTmp;
}
else
{
pTmp->next = pInsert->next;
pInsert->next = pTmp;
}
pTmp = Next;
if(NULL == pTmp)
{
break;
}
Next = Next->next;
pTmp->next = NULL;
}
return ll;
}