c语言链表

1. 链表的结构体定义(结点定义)

链表的一个结点首先肯定包含一个数据域和一个指针域,数据域用来存放结点数据,指针域存放的是指向下一个结点的地址。当然,头节点例外,其实,头结点和普通结点一样,只不过头结点只存放了指向下一个结点的地址(即首结点)。

2、创建节点  为插入做准备,学习数据的时候,一定要把功能划分明确

3、表头插入
//  插在头结点之后  插队插入,不能越过头结点
//  插队插入,不能越过头结点

只需要强调一点,头插法是在头结点尾部,尾插法是在链表尾部插入,这个不要理解错了。其实思想和尾插类似,只要记得插入是和头结点有关,

    newNode->next = headNode->next;

    headNode->next = newNode;

newNode始终是用来接收输入数据,然后插入头结点的尾部,headNode->next是头指针每次插入新节点之前,最近指向一次插入的结点。当新节点排队插入后,需要将新节点的next指向原先插入之前,距离头结点最接的结点  headNode->next

4.尾插法建立链表

这里,尾插法是在链表尾部插入结点的

所以先创建一个头结点,struct Node* newNode = createNode(data);

并提前在 createNode(data)函数中为头节点分配结点空间,

然后 head->next=NULL,此时只有头节点,所以链表下一个结点为空。

尾插法关键代码就是

struct Node* tailNode = headNode;
    while (tailNode->next != NULL)
    {

        tailNode = tailNode->next;
    }
    tailNode->next = newNode;

头插法  依次插入0-9 

尾插法  依次插入 100  1000两个数

// 表头插入  表尾插入  打印链表
 
 
/*   任务   */
//  1、创建表
//  2、创建节点
//  3、表头插入
//  4、表尾插入
//  5、打印表
//  6、表头删除
 
 

 
  1. #include<stdio.h>

  2. #include<stdlib.h>

  3.  

  4. /*  C语言  <1>  什么是链式结构  碎片内存存储*/

  5. /*  创建表:结构体变量和结构体变量  连接在一起  */

  6. //  结构体变量  使用指针去表示----->指针成为变量------->动态内存申请

  7. //  如何去表示一个表:使用第一个节点来表示整个链表

  8. struct Node   //自定义节点

  9. {

  10.  

  11.     int data;

  12.     struct Node *next;

  13. };

  14.  

  15. //  1、创建表

  16. struct Node *createList()

  17. {

  18.  

  19.     struct Node *headNode = (struct Node*)malloc(sizeof(struct Node));

  20.     headNode->next = NULL;

  21.  

  22.     //  变量规则:变量需要初始化,才能使用

  23.  

  24.     //data  为什么不可以初始化  不初始化 与众不同  有表头的链表

  25.     //  差异化处理

  26.     headNode->data = -111;

  27.     return headNode; //  返回指针变量

  28.  

  29. }

  30.  

  31. //  2、创建节点  为插入做准备,学习数据的时候,一定要把功能划分明确

  32. struct Node *createNode(int data)

  33. {

  34.     struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));

  35.     newNode->data = data;

  36.     newNode->next = NULL;

  37.  

  38.     return newNode;  返回指针变量

  39. }

  40.  

  41.  

  42. //  3、表头插入

  43. //  插在头结点之后  插队插入,不能越过头结点

  44. //  插队插入,不能越过头结点

  45.  

  46. // 函数参数设计是具有含义的:插入那个链表??插入的新节点的定义变量

  47. void insertNodeByHead(struct Node *headNode, int data)  //表头法插入

  48. {

  49.     

  50.     // 1、插入的新节点的定义变量

  51.     struct Node* newNode = createNode(data);

  52.     // 2、 插在头结点之后  插队插入,不能越过头结点

  53.     newNode->next = headNode->next;

  54.  

  55.     headNode->next = newNode;

  56. }

  57.  

  58. //  4、表尾插入

  59. void insertNodeByTail(struct Node *headNode, int data)

  60. {

  61.  

  62.     struct Node* newNode = createNode(data);

  63.     struct Node* tailNode = headNode;

  64.     while (tailNode->next != NULL)

  65.     {

  66.  

  67.         tailNode = tailNode->next;

  68.     }

  69.     tailNode->next = newNode;

  70. }

  71.  

  72.  

  73.  

  74.  

  75. void printList(struct Node *headNode)  //打印,浏览信息

  76. {

  77.  

  78.     //  有表头,要从第二个节点开始打印

  79.     struct Node *pMove = headNode->next;

  80.     while (pMove != NULL)

  81.     {

  82.         printf("%d\t", pMove->data);

  83.         pMove = pMove->next;

  84.  

  85.  

  86.     }

  87.  

  88.     printf("\n");

  89. }

  90.  

  91. int main()

  92. {

  93.  

  94.  

  95.     struct Node *list1 = createList();

  96.     for (int i = 0; i < 10; i++)

  97.     {

  98.         insertNodeByHead(list1, i);

  99.     }

  100.     printList(list1);

  101.     insertNodeByTail(list1, 100);

  102.     insertNodeByTail(list1, 1000);

  103.     printList(list1);

  104.     system("pause");

  105.     return 0;

  106. }


头插法  依次插入0-9 

尾插法  插入 100  1000两个数

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值