单链表(头插法和尾插法—考研王道)
头插法:永远在头结点后面插入数据,所以输出结果与输入结果刚好相
反。
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
//定义结构体
typedef struct LNode {
ElemType data; //数据域
struct LNode *next; //指向下一个的指针域
}LNode,*LinkList; //结构体的静态名称和动态指针
//头插法代码
LinkList List_headInsert(LinkList &L)
{
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode)); //声明头结点
L->next=NULL; //头结点的下一个指向为null
scanf("%d",&x);
while(x!=0)
{
s=(LNode*)malloc(sizeof(LNode));//生成一个新结点
s->data=x; //新结点的数据为输入的x;
//下面两行代码事是关键,且不能交换位置
s->next=L->next;
//把头节点的下一个指向(也就是null)为s结点的下一个指向,即:新结点的next指向null
L->next=s;//头节点的下一个next指向结点s
scanf("%d",&x);
}
return L;
}
//输出数据的函数
void print(LinkList &L)
{
LNode *p1; //声明一个LNode型的指针
p1=L; //p1指向头节点
while(p1!=NULL)
{
p1=p1->next; //头结点的下一个结点
printf("%d\n",p1->data);
}
}
int main()
{
LinkList linklist;
List_headInsert(linklist);
print(linklist);
}
尾插法:在每一个结点的后面设置一个尾指针 r,使其始终指向当前链表的尾结点。所以输出结果顺序和输入结果顺序一样
LinkList List_TailInsert(LinkList &L) {
int x;
L=(LinkList)malloc(sizeof(LNode));
LNode *s,r=L; //生成一个指针结点和一个表尾指针(此时表尾指针为头结点)
printf(“输入数字,以0结束:”);
scanf("%d",&x);
while(x!=0){
s=(LNode)malloc(sizeof(LNode)); //生成新结点s
s->data=x;//s的数据为输入的x
r->next=s;//表头的表尾指针指向s结点
r=s; //r指向新的表尾结点
scanf("%d",&x);
}
r->next=NULL;//最终的表尾指针指向空
return L;
}
输出函数不变,主函数差不多,然后输出结果为: