C语言学习(五)链表的格式与操作示例

链表是为克服数组的缺点,在内存空间中离散存储,但需要一个指针记住下一个结点的地址,以便可以将链表结点连接起来。

    链表与数组的比较:

  数组

                  优点:存取速度快。

                  缺点:插入和删除元素的效率很低;

                                需要一块连续的内存空间。

         链表

                  专业术语

                           首节点

                                    存放第一个有效数据的节点

                           尾节点

                                    存放最后一个有效数据的节点

                           头结点

                                    头结点的数据类型和首节点的类型是一样的(结构体变量类型)

                                    头结点是首节点前面的那个节点,头结点并不存放有效数据,

                                    设置头结点的目的是为了方便对链表的操作。

                           头指针

                                    存放头结点地址的指针变量

                           优点:插入删除元素效率高;

                                        不需要一块连续的很大的内存空间。

                           缺点:查找某个位置的元素效率低。

 

                  定义

                             链表的基本单元是节点,节点分为两部分:数据域和指针域,数据域用来存放有效数据,指针域存

                             放下一个节点的地址。所以链表的节点都是结构体变类型。

                             用创建链表时,链表必须为动态创建,以便其它函数对其进行操作。

                             要确定一个链表,只需链表的头指针即可,即函数参数只需一个。

 

链表的实现:

  1. # include <stdio.h>  
  2. # include <malloc.h>  
  3. # include <stdlib.h>  
  4.   
  5. struct Node //通过结构体定义节点  
  6. {  
  7.     int data; //创建数据域  
  8.     struct Node * pNext; //创建指针域  
  9. };  
  10.   
  11. //函数声明  
  12. struct Node * CreateList(void);  
  13. void TraverseList(struct Node *);  
  14. bool isEmpty(struct Node *);  
  15.   
  16. int main(void)  
  17. {  
  18.     struct Node * pHead; //创建头指针,用来存放头结点的地址。  
  19.   
  20.     pHead = CreateList(); //CreateList()函数动态创建链表并返回头结点的地址。  
  21.     printf("\n");  
  22.     TraverseList(pHead); //函数参数只需头指针即可确定一个链表。  
  23.   
  24.     return 0;  
  25. }  
  26.   
  27. struct Node * CreateList(void) //函数返回值为struct Node * 类型。  
  28. {  
  29.     int len;  
  30.     int i;  
  31.     int val;  
  32.   
  33.     struct Node * pHead = (struct Node *)malloc(sizeof(struct Node));  
  34.     if (NULL == pHead)  
  35.     {  
  36.         printf("分配头结点空间失败,程序终止!\n");  
  37.         exit(-1); //exit函数,退出程序。  
  38.     }  
  39.           
  40.     struct Node * pTail = pHead; //创建尾指针指向尾节点  
  41.     pTail->pNext = NULL;  
  42.   
  43.     printf("请输入链表的节点个数:len = ");  
  44.     scanf("%d", &len);  
  45.   
  46.     for (i=0; i<len; ++i)  
  47.     {  
  48.         printf("请输入第%d个节点的值:", i+1);  
  49.         scanf("%d", &val);  
  50.   
  51.         struct Node * pNew = (struct Node *)malloc(sizeof(struct Node)); //链表的不连续性在于它的内存空间在不断地一个个分配,而数组则是一次性分配完成。  
  52.         if (NULL == pNew)  
  53.         {  
  54.             printf("分配空间失败,程序终止!\n");  
  55.             exit(-1);  
  56.         }  
  57.   
  58.         pNew->data = val;  
  59.         pTail->pNext = pNew;  
  60.         pNew->pNext = NULL;  
  61.         pTail = pNew; //递归  
  62.     }  
  63.   
  64.     return pHead;  
  65. }  
  66.   
  67. void TraverseList(struct Node * pHead) //遍历输出  
  68. {  
  69.     struct Node * p;  
  70.   
  71.     if (isEmpty(pHead))  
  72.     {  
  73.         printf("链表为空!\n");  
  74.     }  
  75.     else  
  76.     {  
  77.         p = pHead->pNext; //使指针指向下一个节点  
  78.         printf("链表中的数据为:\n");  
  79.         while (NULL != p)  
  80.         {  
  81.             printf("%d  ", p->data);  
  82.             p = p->pNext;  
  83.         }  
  84.         printf("\n");  
  85.     }  
  86.   
  87.     return;  
  88. }  
  89.   
  90. bool isEmpty(struct Node * pHead)  
  91. {  
  92.     if (NULL == pHead)  
  93.         return true;  
  94.     else  
  95.         return false;  
  96. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值