创建单链表(创建头结点的方式,头插入法初始化赋值)

//键盘输入若干个整数,按输入数据逆序建立一个带头结点的单链表(头插入创建单链表)
#include<stdio.h>
#include<stdlib.h>

typedef struct Link {
    int data;
    struct Link* next;
}link;


//头插入的方式初始化链表
link* initLink(link* head_node) {
    head_node = (link*)malloc(sizeof(link)); //创建头结点
    head_node->data = 0; //头结点数据域初始化赋值为0
    head_node->next = NULL;

    link* ptail = head_node;

    //头插入赋值
    printf("输入若干个值逆序保存到链表中:\n");
    int num = 0;
    while (num != -1) { //输入-1就结束
        scanf("%d", &num);
        link* new_node = (link*)malloc(sizeof(link)); //申请一个新节点
        new_node->data = num; //给新节点赋初值
        new_node->next = head_node; //新节点的指针域是最后一个结点
        head_node = new_node; //新节点成为最后一个结点(头结点,头结点在后面)
        ptail = new_node; //尾指针指向这个新节点,不断往前移动
    }
    printf("尾指针指向的值是:%d\n", head_node->next->data);
    //return ptail; //将指向最后一个结点的尾指针返回
    return head_node;
}


//遍历链表(逆序建立,顺序遍历)
void showLink(link* head_node) {
    link* tmp =head_node->next; //从头结点的下一个结点,即第一个结点开始遍历,避免输出结束标志-1
    while (tmp != NULL) {
        //if (tmp->data == -1) {
        //    break; //顺序遍历,结束标志 -1不输出不能这样控制,否则一个都输出不了
        //}
        printf("%d ", tmp->data);
        tmp = tmp->next;
    }
}

void main() {
    link* myHeadNode = NULL;
    myHeadNode = initLink(myHeadNode); //获取经过初始化的头结点
    printf("逆序建立的链表为:\n");
    showLink(myHeadNode);
}

0是头结点中的值,可以不打印,遍历时遍历到 tmp->data ==0 ,退出遍历即可。

猜你喜欢

转载自www.cnblogs.com/shanlu0000/p/12697537.html