柚子快报邀请码778899分享:数据结构 单链表的插入与删除

http://www.51969.com/

链表是数据结构中的一种线性结构,表示数据运算之间的一种抽象关系。

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;

}

}

 未完待续............

柚子快报邀请码778899分享:数据结构 单链表的插入与删除

http://www.51969.com/

查看原文