刚学过链表的大一萌新对链表相关操作的梳理。留作复习用。(菜鸟的第一篇博客哈)
(一)链表的创建
模板:
typedef struct node
{
int data;(数据域:用来存放数据)
struct *next;(指针域:用来链接前后结点)
}SNode;
创建部分——
1.尾插法
void CreateList1(LNode *H,int n)//(*H为头指针)
{
LNode *p,*r;//(r为尾指针,始终指向链表尾部,以便新结点的插入)
int x;
int i;
head->next = NULL;//(在没有输入数据之前,先将头指针指空)
r=H;//(没输入数据前,H既是头也是尾)
scanf("%d",&x);
for(i=0;i<n;i++)
{
scanf("%d",&x);
p=(LNode *)malloc(sizeof(LNode));//(在for循环中为每一个链表开辟空间)
p->data=x;
r->next=p;//(将新结点p插入尾部)
r=p;//(新结点即为尾结点)
}
r->next=NULL;//(循环结束,尾指针指NULL)
}
2.头插法——
void CreateList2(SNode *H,int n)
{
SNode *p;
int x;
int i;
for(i=0;i<n;i++)
{
scanf("%d",&x);
p=(SNode *)malloc(sizeof(SNode));//创建新结点 为每个新结点开辟空间
p->data=x;
p->next=H->next;//(将头结点next指向赋给新结点)
H->next=p;//(将新数据连接到头结点之后)
}
}
注:(1)先从字面上理解二者的区别,对二者有一个感性的认识。
尾插法:将新数据插入链表尾部
头插法:将新数据插入链表头部
(2)两种方法中,新节点的创建方法是相同的(用malloc动态创建)
(3)尾插法需要两个指针,往往先移动尾指针,然后新结点指针再跟着移动。
头插法不再需要尾指针了,主要是想办法把新来的成员插入链表头结点之后。
输出部分——
void print(LNode *H)
{
LNode *p;
p=H->next;//(首先将头指针赋给p)
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;//(指向下一个结点,依次输出)
}
}
主函数部分——
int main()
{
LNode *H;
int n;
while(scanf("%d",&n)!=EOF)
{
H=(LNode *)malloc(sizeof(LNode));//(首先为头结点开辟空间)
H->next=NULL;//(将头指针指NULL)*注
CreateList1(H,n);
output(H);
printf("%\n");
}
return 0;
}
*注:一定不要忘记H->next=NULL,因为上一步创建了一个只有头结点的链表,所以在CreateList调用之前,头指针一定要指空。