接上篇数组,本篇主要学习链表,实现了创建、遍历、查找给定位置的值以及插入。其他的操作就不写了,基本类似(以非循环单链表为例子),见代码,有详细注释
- #include <stdio.h>
- #include <malloc.h>
- #include <stdlib.h>
- /*
- * 定义一个节点的数据类型
- *
- */
- typedef struct Node
- {
- int data;//数据域
- struct Node * pNext;//指针域
- }NODE,*PNODE;
- /**
- * 创建链表
- * @return PNODE
- *
- */
- PNODE create(){
- int length;//节点个数
- printf("请输入生成的链表的节点个数 length = ");
- scanf("%d",&length);
- //申请链表头节点地址
- PNODE pHead = (PNODE)malloc(sizeof(NODE));
- if(NULL == pHead){
- printf("头节点生成失败");
- exit(-1);
- }
- //定义尾节点
- PNODE pTail = pHead;//尾节点总是等于当前链表的最后节点
- pTail->pNext = NULL;
- //接收输入值作为生成节点的值
- int data;
- for(int i=1;i<=length;i++){
- //循环生成length个节点
- PNODE pNode = (PNODE)malloc(sizeof(NODE));
- if(NULL == pNode){
- printf("第%d个节点生成失败",i);
- exit(-1);
- }
- printf("请输入第%d个节点的值:",i);
- scanf("%d",&data);
- pNode->data = data;
- pNode->pNext = NULL;
- pTail->pNext = pNode;//因为新生成了一个节点,所以生成前的尾节点指向新生成的节点
- pTail = pNode;//当前生成的节点成了新的尾节点
- }
- return pHead;
- }
- /**
- * 遍历一个链表
- * @param PNODE pHead
- */
- void traverse(PNODE pHead){
- if(NULL == pHead->pNext){
- printf("没有节点");
- exit(-1);
- }
- PNODE cNode = pHead->pNext;//初始化当首节点为头节点
- int i = 1;//记录节点位置
- while(NULL != cNode){//如果当前节点不为空
- printf("第%d个节点的值是:%d\n",i,cNode->data);
- cNode = cNode->pNext;//当前节点后移位
- i ++;
- }
- return;
- }
- /**
- * 查找链表给定位置的值
- * @param PNODE pHead
- * @param int pos
- * @return int
- */
- int get(PNODE pHead,int pos){
- if(NULL == pHead->pNext){
- printf("没有节点");
- exit(-1);
- }
- PNODE cNode = pHead->pNext;//初始化当前节点为首节点
- int i = 1;//计数器
- while(NULL != cNode && i < pos){//查到第pos个节点
- cNode = cNode->pNext;
- i++;
- }
- if(NULL == cNode || i > pos){
- printf("不存在第%d个节点",pos);
- exit(-1);
- }
- return cNode->data;
- }
- /**
- * 指定位置后面插入节点
- * @param PNODE pHead
- * @param int pos
- * @param PNODE pNode
- */
- void insert(PNODE pHead,int pos,PNODE pNode){
- PNODE cNode = pHead->pNext;//初始化当前节点为首节点
- int i = 1;//计数器
- while(NULL != cNode && i < pos){//查到第pos个节点
- cNode = cNode->pNext;
- i++;
- }
- if(NULL == cNode || i > pos){
- printf("不存在第%d个节点\n",pos);
- exit(-1);
- }
- if(NULL == cNode->pNext){//第pos个节点正好似尾节点,直接追加
- cNode->pNext = pNode;
- return;
- }
- pNode->pNext = cNode->pNext;//将待插入的节点的指针指向当前节点的下一个节点
- cNode->pNext = pNode;
- return;
- }
- void main(){
- PNODE pHead = NULL;//头结点
- pHead = create();//创建链表
- traverse(pHead);//遍历链表
- int data = get(pHead,2);//查找第2个节点的值
- printf("查到的值为%d\n",data);
- //构造一个新的节点
- NODE node;
- node.data = 100;
- node.pNext = NULL;
- insert(pHead,2,&node);
- traverse(pHead);
- }