这是网上的的源码:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>// 定义链表中的节点
typedef struct node
{int member; // 节点中的成员struct node *pNext; // 指向下一个节点的指针
}Node,*pNode;// 函数声明
pNode CreateList(); // 创建链表函数
void TraverseList(pNode ); // 遍历链表函数int main()
{pNode pHead = NULL; // 定义初始化头节点,等价于 struct Node *pHead == NULLpHead = CreateList(); // 创建一个非循环单链表,并将该链表的头结点的地址付给pHeadTraverseList(pHead); // 调用遍历链表函数return 0;
}// 创建链表函数
pNode CreateList()
{int i; // 用于下面循环int len; // 用来存放有效节点的字数int val; // 用于临时存放用户输入的数据pNode pHead = (pNode)malloc(sizeof(Node)); // 分配一个不存放有效数据的头结点pNode pTail = pHead; // 链表的最后一个节点pTail->pNext = NULL; // 最后一个节点的指针置为空printf("请输入节点个数:");scanf("%d",&len);for(i = 0; i < len; i++){printf("第 %d 个节点的数值:",i+1);scanf("%d",&val);pNode pNew = (pNode)malloc(sizeof(Node)); // 为节点分配空间pNew->member = val; //将用户输入的数据赋给节点的成员pTail->pNext = pNew; //将最后一个节点的指针指向下一个新的节点pNew->pNext = NULL; //将新节点中的指针置为空pTail = pNew; //将新节点赋给最后的一个节点}return pHead; //返回头节点}// 遍历链表函数
void TraverseList(pNode pHead)
{pNode p = pHead->pNext; //将头节点的指针给予临时节点pwhile(NULL != p) //节点p不为空,循环{printf("%d ",p->member); p = p->pNext; }printf("\n");return ;}
自己照着视频敲了一遍,结果卡在一个点上
#include<stdio.h> //创建非循环链表
#include<stdlib.h>
#include<malloc.h>
typedef struct Node
{
int data;
struct Node *pNext;
}NODE,*PNODE;//相当于直接给了个*号 struct Node *int main(void)
{PNODE pHead =NULL;//相当于 struct Node *pHead =Null;先定义清空指针 pHead = create_list();traverse_list(pHead);return 0;
}PNODE create_list(void);
{int len,i,val;PNODE pHead=(PNODE)malloc(sizeof(Node));//分配pHead pintf("请输入你要生成几个节点");scanf("%d",&len);PNODE pTail=pHead;pTail->pNext=NULL;for(i=0;i<len;i++){printf("请输入第%d个数",i+1);scanf("%d",&val);PNODE pNew =(PNODE)malloc(sizeof(Node));//分配pNew pNew->data= val;pTail->pNext=pNew;pNew->pNext=NULL;pTail=pNew; }return pHead;
}void traverse_list(PNODE pHead)
{PNODE p = pHead->pNext; //将头节点的指针给予临时节点pwhile(NULL != p) //节点p不为空,循环{printf("%d ",p->data); p = p->pNext; }printf("\n");return;}
老是说定义的函数类型冲突,哪有冲突啊,不是返回地址型嘛,都是用PNODE的啊,咋就错了呢,比较了一下上面的代码感觉都一样就是不知道哪里出了bug,改天再看看。
创造链表:先分配内存,给数据域赋值,将尾结点指向临时节点,再将临时节点指向空,最后将临时节点赋给尾结点。
就像一条蛇一样,先创造一个东西,然后将它吞并,再创造下一个东西,再吞并。
¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
#######################################################################################
今天我又重新检查了一遍上面的代码,一个一个比对终于发现了问题
首先函数后面能加分号嘛?昨天检查了那么多遍还是没搞出来,的确是状态不好。这么低级的错误都没发现,这个函数又不是放在主函数里的。需要加什么分号。
其次结构体和主函数之间是需要添加函数声明的,我一直以为这只是个形式,我以前从来没遇到过函数还要声明的情况,函数不是只能调用吗…也只有变量需要声明吧(手动滑稽)!
第三个错误就是我把printf给写漏了一个字母,这看上去让人崩溃,几十行几百行的代码,一个单词少写一个字母也是在所难免的啊,可程序就是不放过你的这个错误,行吧,我认了。
可以看到吧,这就是纯手打代码的弊端,错误率居高不下,找bug找到让人崩溃。
但还是有点收获的,自己写的能让自己对这个程序更加的了解、熟知,对以前不知道,不注意的地方进行补充。
同时也让我掌握了一种学习方法,就是想不明白的,不要着急,现在不明白,可以存疑留到明天,明天甚至可以再存到后天,只要每天有点感悟就好了。
总结一下吧
- 先构造结构体
- 声明函数
- 主函数
- 创造链表
- 遍历链表
最难的就是构造链表了,想明白了,就算你链表入门了
附上我改好后的链表(纯手打)
#include<stdio.h> //创建非循环链表
#include<stdlib.h>
#include<malloc.h>
typedef struct Node
{
int data;
struct Node *pNext;
}NODE,*PNODE;//相当于直接给了个*号 struct Node *// 函数声明
PNODE create_list(); // 创建链表函数
void traverse_list(PNODE); // 遍历链表函数int main(void)
{PNODE pHead =NULL;//相当于 struct Node *pHead =Null;先定义清空指针 pHead = create_list();traverse_list(pHead);return 0;
}PNODE create_list(void)
{int len,i,val;PNODE pHead=(PNODE)malloc(sizeof(NODE));//分配pHead printf("请输入你要生成几个节点");scanf("%d",&len);PNODE pTail=pHead;pTail->pNext=NULL;for(i=0;i<len;i++){printf("请输入第%d个数",i+1);scanf("%d",&val);PNODE pNew =(PNODE)malloc(sizeof(NODE));//分配pNew pNew->data= val;pTail->pNext=pNew;pNew->pNext=NULL;pTail=pNew; }return pHead;
}void traverse_list(PNODE pHead)
{PNODE p = pHead->pNext; //将头节点的指针给予临时节点pwhile(NULL != p) //节点p不为空,循环{printf("%d ",p->data); p = p->pNext; }printf("\n");return;}
至于链表的删除,插入,修改之类的,放到以后学了,有时间有心情就会来看看,慢慢来!!!
试试如何改变字体的颜色
试试如何改变字体的颜色