4、链表

1、数组与链表

我们至少可以通过两种结构来存储数据
数组
  优点:
    存取速度快
  缺点:
    需要一个连续的很大的内存
    插入和删除元素的效率很低
链表
专业术语:
  首节点
    存放第一个有效数据的节点
  尾节点
    存放最后一个有效数据的节点
  头结点
    头结点的数据类型和首节点的类型是一摸一样的
    头结点是首节点前面的那个节点
    头结点并不存放有效数据
    设置头结点的目的是为了方便对链表的操作
  头指针
    存放头结点地址的指针变量
  确定一个链表需要一个参数:头指针
  优点:
    插入删除元素效率高
    不需要一个连续的很大的内存
  缺点:
    查找某个位置的元素效率低

/*----------------------------------------
建立一个链表并输出其中的值
-----------------------------------------
链表是动态创建的
-----------------------------------------*/

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

struct Node
{
    int data; //数据域
    struct Node * pNext; //指针域
};

//函数声明
struct Node * create_list(void);
void traverse_list(struct Node *);

int main(void)
{
    struct Node * pHead = NULL; //等价于 struct Node * pHead = NULL;

    pHead = create_list();  //create_list()功能:创建一个非循环单链表,并将该链表的头结点的地址付给pHead
    traverse_list(pHead);  //只需要发送头指针就能输出链表
    
    return 0;
}

struct Node * create_list(void)
{
    int len;  //用来存放有效节点的个数
    int i;
    int val; //用来临时存放用户输入的结点的值

    //分配了一个不存放有效数据的头结点
    struct Node * pHead = (struct Node *)malloc(sizeof(struct Node));
    if (NULL == pHead)
    {
        printf("分配失败, 程序终止!\n");
        exit(-1);
    }
    struct Node * pTail = pHead;
    pTail->pNext = NULL;

    printf("请输入您需要生成的链表节点的个数: len = ");
    scanf("%d", &len);
    
    for (i=0; i<len; ++i)
    {
        printf("请输入第%d个节点的值: ", i+1);
        scanf("%d", &val);
        
        struct Node * pNew = (struct Node *)malloc(sizeof(struct Node));
        if (NULL == pNew)
        {
            printf("分配失败, 程序终止!\n");
            exit(-1);  //终止程序
        }
        pNew->data = val;
        pTail->pNext = pNew;
        pNew->pNext = NULL;
        pTail = pNew;
    }
    
    return pHead;
}

void traverse_list(struct Node * pHead)
{
    struct Node * p = pHead->pNext;

    while (NULL != p)
    {
        printf("%d  ", p->data);
        p = p->pNext;
    }
    printf("\n");
    
    return;
}


/*-----------------------------------------------------------------
打印结果:
        请输入您需要生成的链表节点的个数: len = 5
        请输入第1个节点的值: 10
        请输入第2个节点的值: 12
        请输入第3个节点的值: 14
        请输入第4个节点的值: 16
        请输入第5个节点的值: 18
        10  12  14  16  18
        Press any key to continue
-----------------------------------------------------------------*/

 

posted @ 2020-04-06 18:49  zh_小猿  阅读(106)  评论(0编辑  收藏  举报