数据结构-DAY03

一、一般调试
(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;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值