成立一个单链表,实现尾部插入和尾巴部分插入,单链后面部分

始建一个单链表,达成尾部插入和尾巴插入,单链尾巴部分

/*
目标:制造贰个单链表,实现尾巴部分插入,底部插入,遍历链表
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//定义二个结构体,用来代表一个节点,包涵指针域,数据域

struct node
{
int data; //数据域

struct node *next; //指针域,指向节点的指针,用来接二连三多少个节点
};

//定义二个函数,用来创立节点,为节点分配堆内部存款和储蓄器,由于堆内部存款和储蓄器残留有随机值,创立成功后清空内部存款和储蓄器
//函数的重回值需倘使struct node
*品类,因为创制了二个节点,要操作那么些节点,就须求猎取那些节点的位置音信

struct node *create_node(int data) //int data :为节点的数据域传值
{
struct node *p = (struct node *)malloc(sizeof(struct node)); //
创造三个节点,并赶回其地址值保存到 p 中

if(NULL == p) //判别节点是还是不是中标创设
{
printf(“malloc erro”);
return NULL;
}

bzero(p,sizeof(struct node)); //调用#include
<string.h>中的函数,功效是清理申请的脏内部存储器

//节点创制作而成功并清理后,就填充节点
p -> data = data;
p -> next = NULL;

return p; //重返节点的地址值
}

//尾巴部分插队函数的兑现:通过头指针找到末了一个节点,再将新节点与最后二个节点关联,插入达成;
void insert_tail(struct node *pHeader,struct node *new)
{
//接收头指针的值,开首遍历链表,找到尾节点
struct node *p = pHeader;

while(NULL != p -> next) //遍历链表,找到尾节点
{

p = p -> next;

}

//遍历甘休,找到最终贰个节点就是p
//将新节点的地点值放入最终一个节点的指针域

p -> next = new; //尾巴部分插入成功

new -> next = NULL;
}

 

//尾部插入函数的完结:先将首先个节点的地点值归入新节点的指针域,再将新节点的地址归入头节点的指针域
void insert_head(struct node *hNode,struct node *new)
{
if(NULL == hNode -> next)
{
hNode -> next = new;
new -> next = NULL;
}
else
{
new -> next = hNode -> next;
hNode -> next = new;
}

}

 

 

 

 

 

int main(void)
{
struct node *pHeader = create_node(0);
insert_head(pHeader,create_node(1));
insert_head(pHeader,create_node(2));
insert_head(pHeader,create_node(3));
insert_head(pHeader,create_node(4));

printf(“*********************************头顶插入********************************\n”);
printf(“node 1:%d.\n”,pHeader -> next -> data);
printf(“node 2:%d.\n”,pHeader -> next ->next -> data);
printf(“node 3:%d.\n”,pHeader -> next -> next ->next
->data);
printf(“node 4:%d.\n”,pHeader -> next ->next ->next ->next
-> data);

/***********************************************************************************************/

struct node *pH = create_node(0);
insert_tail(pH,create_node(1));
insert_tail(pH,create_node(2));
insert_tail(pH,create_node(3));
insert_tail(pH,create_node(4));

printf(“*********************************尾部插入********************************\n”);
printf(“node 1:%d.\n”,pH -> next -> data);
printf(“node 2:%d.\n”,pH -> next ->next -> data);
printf(“node 3:%d.\n”,pH -> next -> next ->next ->data);
printf(“node 4:%d.\n”,pH -> next ->next ->next ->next ->
data);

return 0;
}

http://www.bkjia.com/Cyy/1088186.htmlwww.bkjia.comtruehttp://www.bkjia.com/Cyy/1088186.htmlTechArticle创建一个单链表,实现头部插入和尾部插入,单链尾部
/* 指标:创制二个单链表,实现尾巴部分插入,底部插入,遍历链表 */ #include
stdio.h #i…

初阶化单链表
始建结点:

        //定义结点
        class Node: NSObject {
              var value: Int = 0
              var next: Node?
          }

      class ListNode: NSObject {
            //头插法
            func initListNodeFromHead(_ array: [Int]) -> Node {
                    var headNode = Node()
                    for data in array {
                          let tempNode = Node()
                          tempNode.value = data
                          tempNode.next = headNode.next
                          headNode.next = tempNode
                     }
                     if headNode.next != nil {
                          headNode = headNode.next!
                      }
                    return headNode
            }

            //尾巴插法
            func initListNodeFromTail(_ array: [Int]) -> Node {
                    var node = Node()
                    var tail = Node()
                    tail = node
                    for data in array {
                          let tempNode = Node()
                          tempNode.value = data
                          tail.next = tempNode
                          tail = tempNode
                    }
                    if node.next != nil {
                       node = node.next!
                    }
                    return node
              }
              //遍历单链表
              public func printList(_ list: inout Node) {
                    var tempList:Node? = list
                    while tempList != nil {
                          print("\(tempList!.value)")
                          if tempList!.next == nil {
                              break
                          }
                          tempList = tempList!.next!
                      }
              }
    }

调用方法实践

      let list1 = ListNode()
      var node = list1.initListNodeFromHead([3,5,12,20])
      list1.printList(&node)

头插入法结果输出:0,20,12,5,3

  var node = list1.initListNodeFromTail([3,5,12,20])

尾插入法结果输出:0,3,5,12,20

缘何打字与印刷出来的链表前边会多三个0吧?

那是因为开始化链表在此以前,都最初化了多个头结点,代码:

    var headNode = Node()

由此在艺术return在此之前,必要把头结点的指针指向第贰个结点。在点子return的代码以前增进:

      if headNode.next  != nil {
         headNode = headNode.next!
      }

那般输出头插入法输出的结果正是:20,12,5,3

尾插入法输出的结果便是:3,5,12,20


上边提供第三种方法

//使用头插入法创建链表
func initListNodeFromHead2(_ array: [Int]) -> Node {
        var headNode:Node?
        for data in array {
            let tempNode = Node()
            tempNode.value = data
            if headNode == nil {
                headNode = tempNode
            } else {
                tempNode.next = headNode
                headNode = tempNode
            }
        }
        return headNode!
    }

//尾巴插法
func initListNodeFromTail2(_ array: [Int]) -> Node {
        var headNode:Node?
        var tail:Node?
        for data in array {
            let tempNode = Node()
            tempNode.value = data
            if tail == nil {
                tail = tempNode
                headNode = tail
            } else {
                tail?.next = tempNode
                tail = tempNode
            }
        }
        return headNode!
    }

出口的结果与第一种同等。

在钦点地点中插入结点

func insertData(_ headNode: inout Node, _ pos: Int,_ data: Int) {
        let tempNode = Node()
        tempNode.value = data
        var j = 0
        var tempList = headNode
        while tempList.next != nil && j < pos - 1 {
            tempList = tempList.next!
            j = j + 1
        }
        if j != pos - 1 {
            return
        }
        tempNode.next = tempList.next
        tempList.next = tempNode
    }

调用代码

        let list1 = ListNode()
        var node = list1.initListNodeFromTail2([3,5,12,20])
        list1.insertData(&node,4,30) //在pos为4的下标插入数字30
        list1.printList(&node)

打字与印刷结果:3、5、12、20、30

删除钦点地点的结点

func deleteData(_ headNode: inout Node, _ pos: Int) -> Int {
        var tempNode:Node?
        var j = 0
        var tempList = headNode
        while tempList.next != nil && j < pos - 1{
            tempList = tempList.next!
            j = j + 1
        }
        if j != pos - 1 {
            return -1
        }
        tempNode = tempList.next
        tempList.next = tempNode?.next
        if tempNode != nil {
            let data = tempNode!.value
            tempNode = nil
            return data
        }
        return -1
    }

调用代码

        let list1 = ListNode()
        var node = list1.initListNodeFromTail2([3,5,12,20])
        list1.insertData(&node,4,30) //在pos为4的下标插入数字30
        list1.printList(&node)
        list1.deleteData(&node, 2)
        list1.printList(&node)

打字与印刷结果:3、5、20、30

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图