初学链表第一天总结笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_33232390/article/details/50184369

自学第一天 深深感觉到数据结构与算法深深的恶意。。。(对于头结点,头指针,首元结点,就被搞蒙了)


接下来说说自己对头结点 头指针 首元结点的认识吧。(自己想的,也有可能有错误,希望大家指出本菜鸟的错误,一起学习交流!)

1  对于头指针与头结点 我们可以这么想:头结点就是头指针指向的结点

*head 是一个头指针  头指针指向的结点(头结点)中没有存数据,但是存了下一个结点(首元结点)的指针。

我们可以这样简单的认为:*head指向的是头结点,*(head->next)指向的是首元结点。

自己画的一个示意图:


这是自己的一些理解,下面是按着参考书在linux环境下写的一个单向链表创建与插入的小程序。

#include <stdio.h>

#include <stdlib.h>

typedef struct Node
{
    int data;
    struct Node *next;
}LNode;

LNode *create(int n)         //创建带头结点的n个结点的链表
{
    LNode *head,*p1,*p2;
    int a;
    int i = 1;
    head = (LNode *)malloc(sizeof(LNode));  //申请一个头节点
    head->next = NULL;                                //初始化建一个空表
    for(; n > 0 ; n--)
    {
        p1 = (LNode*)malloc(sizeof(LNode)); //申请一个新结点
        printf("请输入你要放进链表中的第%d个数据(整数)\n",i);
        scanf("%d",&a);
        p1->data = a;                       //新结点赋值

        if(head->next == NULL)               //判断是否为空表
        {
            head->next = p1;                //是空表就将链表首元结点赋值p1
            p2 = p1;
        }
        else
        {
            p2 -> next = p1;              //将新结点一个个接到链表尾部
            p2 = p1;
        }
        i ++;
    }
        p2 -> next = NULL;                //结束创建,尾指针为空
        return head;
}

int ListInsert(LNode *head ,int i,int x)  //第i个结点前插入数据元素
{
    LNode *p2,*p1;
    int j = 0;
    
    p2 = head;
    while(p2 != NULL && j < i-1)   //遍历链表 找到i-1的结点
    {
        p2 = p2->next;
        j++;
    }
    if(j != i-1)
    {
        printf("error..\n");
        exit(1);
    }
    p1 = (LNode*)malloc(sizeof(LNode));   //申请新结点
    p1->data = x;                         //新结点赋值
    
    p1->next = p2->next;                 //插入
    p2->next = p1;
    return 1;
}
void main()
{
    LNode *q,*q1;
    int n,i,x;
    printf("请输入你要创建链表的结点个数 (整数): \n");
    scanf("%d",&n);

    q = create(n);             //创建链表
    q1 = q;
    printf("您输入的链表为: \n");

    while(q->next != NULL)
    {
        q = q->next;
        printf("%d\t",q->data);
    }
    printf("\n");

    printf("请输入结点插入位置\n");    
    scanf("%d",&i);
    printf("请输入插入的数据\n");
    scanf("%d",&x);
    
    ListInsert(q1,i,x);   //插入数据

    printf("您插入后的链表为: \n");
    while(q1->next != NULL)
    {
        q1 = q1->next;
        printf("%d\t",q1->data);
    }
    printf("\n");

}


下面是运行结果:




猜你喜欢

转载自blog.csdn.net/baidu_33232390/article/details/50184369
今日推荐