链表是数据结构中的一种线性结构,表示数据运算之间的一种抽象关系。
1、单链表的结构如下:
typedef struct node{
datatype data; //数据
struct node *next; //指向下一个节点的指针
}linklist_s;
其中包括一个数据域和一个指针域,向单链表中插入成员时只需要再次分配一个同样的变量,让上一个变量中的指针域指向下一个节点即可,比起顺序表来说,链表更加灵活。
2、单链表的创建
*先创建链表头,将指针域指向NULL,将数据域设置0
linklist_s *LinkListCreate(void)
{
linklist_s *h;//定义一个linklist_s结构体类型的变量 *h
h = (linklist_s *)malloc(sizeof(*h));//通过malloc申请内存空间
h->data =0; //将数据域设值为0
h->next = NULL; //指针域指向空
return h;
}
3、单链表的插入
*头插法:
*尾插法:
*位置插法:
头插法代码如下:
(尾插法与位置插法只需要找到位置之后插入节点,本质上与头插法是一样的)
//头插法:
int LinkListInsert(linklist_s *h,datatype data)
{
linklist_s *tmp;
tmp = (linklist_t *)malloc(sizeof(*tmp));
//1.分配临时的节点,将data放入到节点的数据域中
tmp->data = data;
//2.将tmp插入到节点中
tmp->next = h->next;
h->next = tmp;
//3.成功返回0
return 0;
}
4、单链表的删除
*头删法
*尾删法
*位置删法
头删法代码如下:
(尾删法与位置删法只需要找到位置之后删除节点,本质上与头删法是一样的)
int LinkListDeleteHead(linklist_s *h)
{
linklist_s *tmp;
//1.让tmp指向要删除的节点
tmp = h->next;
//2.让h->next指向下下一个节点
h->next = h->next->next;
//3.释放节点占用的内存
if(tmp != NULL){
free(tmp);
tmp = NULL;
}
return 0;
}
如何找到要删除的位置?
//尾删法:让h->next->next走到NULL的位置
//尾删法:让h->next->next走到NULL的位置
while (h->next->next != NULL) {
h = h->next;
}
//位置删法:(pos为要删除的位置)
while (h->next != NULL) {
if (pos != 0) {
pos--;
h = h->next;
}
***********如何将一个正序的单链表倒置呢?*********
void LinkListReverse(linklist_s *h)
{
linklist_s *tmp,*iter;
//让iter指针指向头节点之后的节点
iter = h->next;
//先让h->next指向空,意思链表中没有任何的节点
h->next = NULL;
//如果iter不为空,循环继续
while(iter){
//让tmp取到第一个节点
tmp = iter;
//让iter指向下一个节点
iter = iter->next;
//使用头插法将tmp插入到h之后
tmp->next = h->next;
h->next = tmp;
}
}
未完待续............