链表:
一系列结构连在一起, 每一个结构体变量里面都有一个指针 pNext,pNext 指向下一个结构体变量, 尾节点的 pNext 指向 NULL
静态链表:
- structstudents stu1 = { 1, "a", NULL };
- structstudents stu2 = { 2, "b", NULL };
- structstudents stu3 = { 3, "c", NULL };
- stu3.pNext = &stu2;
- stu2.pNext = &stu1;
动态内存分配:
- Malloc();
- void *malloc(unsigned int size)
这个函数在内存中动态开辟一块内存, unsigned int size 决定内存的大小, void * 空指针可以强制转换为任何类型的指针
这个函数返回一个指针, 这个指针就是开辟的内存地址
- pHead = (structstudents*)malloc(sizeof(structstudents));
- free();
- void free(void *ptr)
free: 释放内存
free(pHead);
1 怎样来创建一个链表
创建一块内存:
- struct students *pHead = NULL; // 头指针
- struct students *pEnd = NULL; // 尾指针
- pHead = (struct students *)malloc(sizeof(struct students)); // 开辟头结点
- printf("请输入一个学生的学号和姓名:");
- scanf("%d%s", &pHead->number, pHead->name);
- pHead->pNext = NULL;
- printf("%d", pHead->number);
增:
1 头部增加: 头结点会变 需要返回一个 pHead
2 新节点的 pNext 指向 pHead
3pHead 指向 pNew
注意: 2 和 3 不能逆序
- // 在头部插入一个节点
- structstudents *InsertAtHead(structstudents *pHead)
- {
- // 新建一个节点
- printf("在头部插入一个节点");
- structstudents *pNew;
- pNew = (structstudents*)malloc(sizeof(structstudents));
- printf("请输入新学生的信息!");
- scanf("%d%s", &pNew->number, pNew->name);
- pNew->pNext = pHead; // 让新节点的 pNext - 原来的头结点
- pHead = pNew; // 把 pHead 指向新节点
- count++; // 节点数 + 1
- returnpHead;
- }
2 在尾部插入一个节点
1 创建一个节点 pNew
2 顶一个中间的指针 pTemp 通过循环(条件为 pTemp->pNext!=null). 得到尾节点
- 3pTemp->pNext=pNew;
- pNew->pNext=NULL;
在尾部插入一个节点
- void InsertAtEnd(structstudents *pHead)
- {
- // 新建一个节点
- printf("在尾部插入一个节点");
- structstudents *pNew;
- pNew = (structstudents*)malloc(sizeof(structstudents));
- printf("请输入新学生的信息!");
- scanf("%d%s", &pNew->number, pNew->name);
- structstudents *pTemp;
- pTemp = pHead;
- //for (int i = 1; i < count; i++) // 节点数的值
- //{
- // pTemp = pTemp->pNext;
- //}
- //for (; pTemp->pNext != NULL; pTemp = pTemp->pNext);
- while (pTemp->pNext != NULL)
- {
- pTemp = pTemp->pNext;
- }
- pNew->pNext = NULL;
- pTemp->pNext = pNew;
- count++; // 节点数
- }
在中间插入
- // 在中间 (第几个节点之后) 插入节点
- void InsertAtMid(structstudents *pHead, intindex)
- {
- // 新建一个节点
- printf("在第 %d 个节点后插入一个节点",index);
- structstudents *pNew;
- pNew = (structstudents*)malloc(sizeof(structstudents));
- printf("请输入新学生的信息!");
- scanf("%d%s", &pNew->number, pNew->name);
- structstudents *pTemp;
- structstudents *pPre;
- pTemp = pHead;
- pPre = pHead;
- for (int i = 1; i < index+1; i++) // 假设 index=2 需要循环 2 次
- {
- pPre = pTemp;
- pTemp = pTemp->pNext;
- }
- pPre->pNext = pNew;
- pNew->pNext = pTemp;
- count++;
- }
今天小编就详解到这了哦! 感谢大家的分享, 小编会持续更新完 C 语言基础的所有章节! 喜欢的读者请关注并转发! 留言在评论区, 小编看到了会回复大家!
来源: http://www.jianshu.com/p/f4ebfd017ff9