数据结构线性表的一些总结

Posted by JIN Blog on May 27, 2018

数据结构线性表的一些总结:

​ 首先链表一定会有一个头指针并且和结构体相同的类型,这个头指针可以不存放结构数据,首先在没有数据输入的时候其值为NULL;头指针的目的就是为了用户在申请下一个数据时候,将下一个结构体数据的地址交给头指针来形成链接。此图包含空节点

​

​ 这样便可以将用户输入的数据利用malloc函数来申请内存,先将数据存在申请的结构体中,然后就是通过指针来找到输入的数据的地址,将头指针指向用户数据的地址,这样便可以将整个数据链接起来形成链表。注意根据链表的规则头指针是没有前驱,链表最后一个数据是没有后继,即最后一个结构体数据的指针为NULL;在内存中的存放方式为:

​ 在用户申请内存并存放玩数据之后,在链接头指针和用户数据时候,一定要备份好头指针的数据,在链表的基本运算中不可以直接对头指针进行操作,避免头指针无意中被更改,这样便失去头指针和用户数据的桥梁了,一般对头指针进行一个指针拷贝,htemp=head; 然后再利用htemp进行链表的其他运算。这样htemp就可以指向最后一个节点以便于进行其他的链表运算

/* 线性表的单链表存储结构 */
typedef struct Node
{
    ElemType data;
    struct Node *next;
} Node;
/* 定义LinkList */
typedef struct Node *LinkList;

这时候,定义的结构体指针用的比较多,在链表中不需要再单独定义结构体变量,因为在以后定义结构体指针的同时必须要用malloc(sizeof(结构体))来给指针开辟内存空间来存放数据。这时候的数据是存在堆中的,要释放时候利用free函数。

插入头结点的逻辑:

  • 首先malloc分配内存空间,保存新的节点
  • 使新的节点指向头指针head所指向的节点
  • 然后使头指针指向新的节点

追加节点的逻辑:

  • 首先malloc分配内存空间,保存新的节点
  • 从头指针head开始逐个检查,直到找到最后一个节点即表尾
  • 将表尾的节点的指针(p->nextnode)设置为新的节点的地址
  • 将新增的节点的指针部分设置为NULL,即新增节点为表尾

链表节点的删除逻辑:

  • 查找要删除的节点

  • 使前一个节点指向当前要删除节点的下一个节点

  • 删除节点

    ​

链表的排序逻辑:

void List_Sort(List_Link head)
{
    List_Link   HEAD;      //HEAD来保存完整链接
    List_Link move,htemp;// htemp是保存断开后链接的头,  //move和htemp 都需要移动
    move=head->Next_Link;                           //move一直移动遍历
    head->Next_Link=NULL;
    while(move)
    {
        htemp=move;            //用来保存断开之前完整的链接,htemp现在为断掉后的头指针
        move=move->Next_Link;//move指针往下遍历
        HEAD=head;                 //用来链接从头指针开始完整的链接,此时是空值
        while(HEAD->Next_Link && HEAD->Next_Link->data < htemp->data)
        {
            HEAD=HEAD->Next_Link;
        }
        htemp->Next_Link=HEAD->Next_Link;
        HEAD->Next_Link=htemp;
    }

}