链表的建立
对于初学者来说,刚刚接触链表,可能会有点陌生,但你看完下面这篇博客后,你将豁然开朗,原来,链表是那么的简单。。。。。
买不买得起M4就看你们了!!!
注释都在代码里了。。。。
代码如下:
创建新的结点部分:
struct link *AppendNode(struct link *head)//函数功能:新建一个节点并添加到链表末尾,返回添加节点后的链表的头指针
{
struct link *p=NULL,*pr=head;
int data;
p=(struct link *)malloc(sizeof(struct link));//让p指向新建结点(开辟空间)
if(p==NULL) //若申请内存失败则退出程序
{
printf("没有足够的内存分配!\n");
exit(0);
}
if(head==NULL)//若原链表为空表,则将新的节点设置为头节点
{
head=p;
}
else
{
while(pr->next!=NULL)//若未到表尾则移动到表尾
{
pr=pr->next;//让pr指向下一个节点
}
pr->next=p;//让末节点的指针域指向新建节点
}
printf("输入节点数据:");
scanf("%d",&data);
p->data=data;//将新建节点的数据域赋值为输入的节点数据值
p->next=NULL;//将新建节点置为表尾
return head; //返回添加节点后的链表的头指针
}
这是显示结点部分:
void DisplyNode(struct link *head)
{
struct link *p=head;
int j=1;
while(p!=NULL)//若不是表尾,则循环打印节点的值
{
printf("%5d%10d\n",j,p->data);//打印第j个节点的数据
p=p->next;//让p指向下一个节点
j++;
}
}
这是释放内存空间:
void DeleteMemory(struct link *head)
{
struct link *p=head, *pr=NULL;
while(p!=NULL)//若不是表尾,则释放节点占用内存
{
pr=p;//在pr中保存当前节点指针
p=p->next;//让p指向下一个节点
free(pr);//释放pr指向的当前节点占用的内存
}
}
这是主函数部分:
int main()
{
int i=0;
char c;
struct link *head=NULL;//建立一个头指针
printf("你想建立一个新的结点吗?(y/n)");
scanf("%c",&c);
while(c=='y'||c=='Y')
{
head=AppendNode(head);//添加节点
DisplyNode(head);//显示当前联链表中的各节点信息
printf("你想建立一个新的结点吗?(y/n)");
scanf(" %c",&c);
i++;
}
printf("%d个新的节点已被建立!\n",i);
DeleteMemory(head);//释放所有动态分配的内存
} //主函数结束
其实链表的建立其实很简单,这里使用的是尾插法。开辟一个内存空间,作为头结点,然后移动指针,让指针指向末尾,继续开辟一个空间插到链表的末尾作为新插入的结点,用于下一个数据的储存(在每次建立结点前必须先将指针移动到链表的末尾!!!)。