单链表的简单代码及解释(头插法为例)
头插法的中心思想是:两个结点类型的指针变量,一个用来存放新开辟空间的地址,另一个用来存放,开辟的空间的首地址,这些开辟的空间的连接时通过这两个指针变量连接起来的。
尾插法的中心思想是:三个结点类型的指针变量,一个用来存放第一个开辟空间的地址(head指针),一个用来存放最后一个开辟空间的地址(相连接中的最后一个。tail指针),一个用来存放开辟新空间的地址(p指针),tail和p把这些开辟的空间连接起来。
以头插法方式编写链表的建立和输出函数:
链表的数据元素的结构类型:
struct Node //为了让大家更好的理解程序,就没有用typedef关键字
{
char data; //存放输入字符
struct Node * next; //存放结点地址
};
{
char data; //存放输入字符
struct Node * next; //存放结点地址
};
//初始化输入函数:
void inpu(struct Node* &l) //struct Node *说明的是变量的类型,&说明的是传参形式
{
char ch; //存放输入的字符
struct Node * p;//用于存放新开辟空间的地址
{
char ch; //存放输入的字符
struct Node * p;//用于存放新开辟空间的地址
printf("\n\n\n\n\n请输入您的字符:\n");
while((ch=getchar())!='$')//当输入'$'字符时,输入结束
{
p=(struct Node *)malloc(sizeof(struct Node));//动态的开辟一个空间
p->data=ch;//向开辟空间的data中存放输入
//把新开辟的结点连接到链表中
p->next=l;
l=p;
l=p;
}
}
}
//全部输出字符函数:
void prin(struct Node *l)
{
l=l->next; //因为我们头结点的data中没有存放数据,所以遇过去
while(l->next!=NULL) //判断结点是否存在
{
cout<<"\n "<<l->data; //输出字符
l=l->next; //指向下一个结点的地址
}
cout<<"\n\n操作完成!\n";
}
{
l=l->next; //因为我们头结点的data中没有存放数据,所以遇过去
while(l->next!=NULL) //判断结点是否存在
{
cout<<"\n "<<l->data; //输出字符
l=l->next; //指向下一个结点的地址
}
cout<<"\n\n操作完成!\n";
}
//主函数
void main()
{
struct Node * head; //存放头结点地址的指针
head=(struct Node *)malloc(sizeof(struct Node));//开辟头结点
head->next=NULL;//头结点中的next为NULL
inpu(head); //调用自定义输入函数
prin(head); //调用自定义输出函数
}
{
struct Node * head; //存放头结点地址的指针
head=(struct Node *)malloc(sizeof(struct Node));//开辟头结点
head->next=NULL;//头结点中的next为NULL
inpu(head); //调用自定义输入函数
prin(head); //调用自定义输出函数
}
插入、删除、查找等操作,可以自己试着完成一下!