链表是数据结构中的一种线性结构,表示数据运算之间的一种抽象关系。
1、单链表的结构如下:
typedef struct node{datatype data; //数据struct node *next; //指向下一个节点的指针
}linklist_s;
其中包括一个数据域和一个指针域,向单链表中插入成员时只需要再次分配一个同样的变量,让上一个变量中的指针域指向下一个节点即可,比起顺序表来说,链表更加灵活。
2、单链表的创建
*先创建链表头,将指针域指向NULL,将数据域设置0
linklist_s *LinkListCreate(void)
{linklist_s *h;//定义一个linklist_s结构体类型的变量 *hh = (linklist_s *)malloc(sizeof(*h));//通过malloc申请内存空间h->data =0; //将数据域设值为0h->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.成功返回0return 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;}
}
未完待续............