链表与顺序表不同链表是用一组任意的储存单元来存放线性表的结点,这组结点可以是连续的,也可以是非连续的,甚至可以是零散分布在内存的任何位置,为了能正确的去表达结点的逻辑关系,必须在储存元素值的同时,存储后继结点的地址信息,下面是结构图
由图可以看出,单链表有两个域,数据域和指针域,因为每个结点只有一个指针域,所以被称为单链表,需要注意的一点,单链表的每个结点储存地址是存放在前驱结点的指针域的,但是第一个结点没有前驱,所以我们需要一个head指针来存放第一个结点。
例子:创建一个单链表来存放a,b,c,d这几个元素
下面是单链表的示意图
我们先来看看头插法
什么是头插法,我们每次读入数据申请新结点,将读入的数据存放到新结点的数据域中,然后将新结点插入到当前当前链表的表头结点之后,然后结点的next指向空,接下来我们插入结点的时候,该结点的next指向原来头结点的next,结点的头连接头结点的next,注意不要写反了,不然会出错,
下面是头插法完整代码
#include <stdio.h>
#include <stdlib.h>
struct node
{char data;node *next;
}link;
node *creat(node *l,char ch)
{int choose;node *p;p=(node *)malloc(sizeof(node));p->data=ch;p->next=l->next;l->next=p;return p;
}
int main()
{char ch;int i=1;int choose;node *l;l=&link;l=(node *)malloc(sizeof(node));l->next=NULL;node *head;head=(node *)malloc(sizeof(node));head=l;int num;printf("请输入数据个数\n");scanf("%d",&num);printf("请输入数据:");getchar();for(int k=0;k<num;k++){scanf("%c",&ch);l=creat(l,ch);}for(int j=0;j<num;j++){printf("%c",head->next->data);head=head->next;}
}
运行测试