头文件、存储结构、初始化
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>//头文件
typedef char Elemtype;
typedef struct Node
{
Elemtype data;
struct Node *next;
}Node,*Linklist;//定义存储结构
void init_Linklist(Linklist *L)
{
*L=(Linklist)malloc(sizeof(Node));
(*L)->next=NULL;
}//初始化
头插法
用两个指针L,s
void creatfromhead(Linklist L)
{
Node *s;
int flag=1;//设置一个结束标志
char c;//接收输入的数据
while(flag)
{
c = getchar();//读入
if(c!='$')
{
s=(Node*)malloc(sizeof(Node));//为新结点s申请空间
s->data=c;//把数据放入data数据域
s->next=L->next;//把L的后驱结点的地址赋给新节点的next指针域
L->next=s;//头指针的指针域指向新的结点
}
else
flag=0;
}
}
main()
{
Linklist L;
Node *p;//该指针用来读出建立好的单链表的数据
init_Linklist(&L);
printf("用头插法建立单链表,输入头插法的数据,以$为结束符号\n");
creatfromhead(L);
p = L->next;//从第一个结点开始
while(p!=NULL)
{
printf("%c\n",p->data);
p = p->next;//移动到下一个结点
}
}
下图更为直观
尾插法
用三个指针L,r,s
void creatfromtail(Linklist L)
{
int flag=1;
Node *r,*s;//r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点
char c;
r=L;
while(flag)//循环输入表中元素值,将建立新结点s插入表尾
{
c = getchar();
if(c!='$')
{
s = (Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
flag = 0;
r->next=NULL;//将最后一个结点的next链域置为空,表示链表的结束
}
}
main()
{
Linklist L;
Node*p;
init_Linklist(&L);
printf("用尾插法建立单链表,输入数据,以$为结束符\n");
creatfromtail(L);
p=L->next;
while(p!=NULL)
{
printf("%c\n",p->data);
p=p->next;
}
}
顺序如下图: