数据结构线性表的一些总结:
首先链表一定会有一个头指针并且和结构体相同的类型,这个头指针可以不存放结构数据,首先在没有数据输入的时候其值为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;
}
}