重难点:节点的连接---我使用的是尾插法
想法:首先创建一个结构体-Node,再使用typedef进行简化定义。
创建链表:先考虑特殊情况(NULL);重点来了:尾插法:首先定义一个指针pTail指向头节点,注意我们可以理解pTail是永远指向最后一个最后一个节点,那么接下来就会相对好理解一些了,然后令pTail->pNext=NULL; ,输入后再进入循环进行节点的连接,先是把val(节点值的存放)添加到data中,然后尾插法又来了,将pTail的指针域指向新的节点,进行连接新的节点,然后将新的节点的指针域指向空,以此成为尾节点,刚才我们提到了pTail是指向尾节点,所以将pTail移向pNew的位置,使其指向尾节点即可,然后进行下一次的循环,可以慢慢体现出尾插法的魅力所在了。
遍历:重点就是把握while循环结束的条件。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Node {
int data;//数据域
struct Node* pNext;//指针域
} NODE,*PNODE;
//函数声明
PNODE creat_list(void);
void traverse_list(PNODE pHead);
int main(void) {
PNODE pHead=NULL;
pHead=creat_list();//链表创建
traverse_list(pHead);
return 0;
}
PNODE creat_list(void) {
int i;
int len;
int val;//节点值的存放
PNODE pHead=(PNODE)malloc(sizeof(NODE));
if(pHead==NULL) {
printf("分配失败");
exit(-1);//异常退出
}
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));
if(pNew==NULL) {
printf("分配失败");
exit(-1);
}
pNew->data=val;
//尾插法
pTail->pNext=pNew;//连接新的节点
pNew->pNext=NULL;//将节点作为尾节点
pTail=pNew;//pTail成为尾节点
}
return pHead;
}
void traverse_list(PNODE pHead) {
PNODE p=pHead->pNext;//指向第一个有效节点
while(p!=NULL) {
printf("%d ",p->data);
p=p->pNext;
}
printf("\n");
return;
}
第一次写文章,希望大佬可以提出一些建议。
谢谢大家的支持。