day20:零基础学嵌入式之c语言——数据结构

一、调试

day20:零基础学嵌入式之c语言——数据结构_第1张图片

二、单向链表的操作

1.单向链表的修改

int ModifyLinkList(LinkList*ll,char*name,DATATYPE*data)
{
    DATATYPE * tmp = FindLinkList(ll, name);
    if(NULL == tmp)
    {
        return 1;
    }
    memcpy(tmp,data,sizeof(DATATYPE));
    return 0;
}

2.单向链表的销毁

int DestroyLinkList(LinkList**ll)
{
    while(1)
    {
        LinkNode * tmp = (*ll)->head;
        if(NULL == tmp)
        {
            break;
        }
        (*ll)->head = (*ll)->head->next;
        free(tmp); 
    }
    free(*ll);
    *ll = NULL;
    return 0;
}

3.单向链表找中间结点

LinkNode* FindMidLinkList(LinkList*ll)
{
    LinkNode*slow = ll->head;
    LinkNode*fast = ll->head;
 
    while(fast)
    {
        fast =fast->next;
        if(NULL == fast)
        {
            break;;
        }
        slow = slow->next;
        fast =fast->next;
    }
 
    return slow;
}

4。单向链表找倒数k个节点

/**
 * @brief 查找倒数第k个节点
 * 
 * @param ll 需要查找的链表
 * @param k 倒数第k个节点
 * @return LinkNode* 找到对应的节点
 */
LinkNode*FindKLastLinkList(LinkList*ll,int k)
{
    LinkNode*slow = ll->head;
    LinkNode*fast = ll->head;
    
    int i = 0;
    for(i = 0;inext;
    }
    while (fast) 
    {
        fast =fast->next;
        slow = slow->next;
    }
    return slow;
}

5.单向链表的逆序

int SortLinkList(LinkList *ll)
{
    int len = GetSizeLinkList(ll);
    if(len<2)
    {
        return 1;
    }
    LinkNode *pinser = ll->head;
    LinkNode *ptmp = pinser->next;
    LinkNode *late = ptmp->next;
    ptmp->next = NULL;
    pinser->next = NULL;
    while(1)
    {
        pinser = ll->head;
        while(pinser->next != NULL && pinser->data.socredata.socre && pinser->next->data.socredata.socre)
        {
            pinser=pinser->next;
        }
        if(pinser->data.socre>ptmp->data.socre)
        {
            ptmp->next = ll->head;
            ll->head=ptmp;
        }
        else
        {
            ptmp->next = pinser->next;
            pinser->next=ptmp;
        }
        ptmp = late;
        if(NULL == ptmp )
        {
            break;
        }
        late = late->next;
        
        ptmp->next =NULL;
    }
    return 0;
}

6.判断是否循环列表

int circultlarLinkList(LinkList* ll)
{
  LinkNode* slow = ll->head;
  LinkNode* fast = ll->head;
 
  while (fast)
    {
      fast = fast->next;
      if (NULL == fast)
        {
          break;
        }
      slow = slow->next;
      fast = fast->next;
      if(fast->next != ll->head)
      {
        return 0;
      }
      else
      {
        return 1;
      }
    }
 
  return 0;
}

三、顺序表和链表 优缺点
1.存储方式:

(1)顺序表是一段连续的存储单元
(2)链表是逻辑结构连续物理结构(在内存中的表现形式)不连续
2.时间性能

(1)查找

         顺序表O(1)
         链表  O(n)
(2)插入和删除
        顺序表 O(n)
        链表   O(1)
3.空间性能

(1)顺序表 需要预先分配空间,大小固定。
(2)链表, 不需要预先分配,大小可变,动态分配。

你可能感兴趣的:(c语言,数据结构,开发语言)