单链表的创建(一)
尾插法
#include <stdio.h>
#include <algorithm>
#define n 3
static int k=0;
struct ListNode
{
int data;
struct ListNode *next;
};
//主要是这部分得搞懂。
void Insert_Element(ListNode* &p,int data)
/*这里的参数传递一开始没写对,我写成了ListNode* p。
然后发现每次返回到主函数的时候,p的地址都没有改变。
如果是采取ListNode* p的形式,那就是指针传递,不是ListNode* &p的引用传递。
指针作为参数在函数中传递的时候,它的实质依然是值传递,形参只是实参的一份拷贝,他们分别属于不同的两个指针变量。
*/
{
struct ListNode* q=(struct ListNode* )malloc(sizeof(ListNode));//需要申请一个新的结点
q->data=data;
p->next=q;//不能断链。这条语句使p的next指向q所指的结点
p=q;//尾插法要求指针p始终指向最后一个结点。写成p=p->next也行。
printf("p[%d]的地址=%p\n",k++,p);
p->next=NULL;//如果这里不置为空,那么在主函数输出的时候,q!=NULL就会一直成立
}
int main()
{
int data;
struct ListNode* head=(struct ListNode* )malloc(sizeof(ListNode));//malloc需要algorithm
printf("head的地址=%p\n",head);
head->next=NULL;//带头结点
struct ListNode* p=head;
for(int i=0;i<n;i++)
{
printf("p[%d]->data=",i);
scanf("%d",&data);
Insert_Element(p,data);
}
struct ListNode* q=head->next;
printf("链表为:");
while(q!=NULL)
{
if(q->next!=NULL)
{
printf("%d->",q->data);
q=q->next;
}
else
{
printf("%d",q->data);
q=q->next;
}
}
return 0;
}
运行结果:
主要实现算法:
q->data=data;
p->next=q;
p=q;
p->next=NULL;
头插法
#include <stdio.h>
#include <algorithm>
#define n 3
struct ListNode
{
int data;
struct ListNode *next;
};
void Insert_Element(ListNode* &head,int data)
{
struct ListNode* q=(struct ListNode* )malloc(sizeof(ListNode));
q->data=data;
q->next=head->next;
head->next=q;
}
int main()
{
//头插法
int data;
struct ListNode* head=(struct ListNode* )malloc(sizeof(ListNode));//malloc需要algorithm
head->next=NULL;//带头结点
struct ListNode* p=head;
for(int i=0;i<n;i++)
{
printf("p[%d]->data=",i);
scanf("%d",&data);
Insert_Element(head,data);
}
struct ListNode* q=head->next;
printf("链表为:");
while(q!=NULL)
{
if(q->next!=NULL)
{
printf("%d->",q->data);
q=q->next;
}
else
{
printf("%d",q->data);
q=q->next;
}
}
return 0;
}
运行结果:
核心代码:
q->data=data;
q->next=head->next;
head->next=q;
反思:是不是应该加个尾指针比较好呢?最后一个结点还没有指向NULL吧。