写在前面的一些话:这只是个人学习王道数据结构的代码笔记,仅供参考,如果有错误请友好的指出,谢谢!!!
一、单链表的尾插法
由于使用头插法建立单链表,表内数据顺序与输入数据顺序刚好相反,如果要使链表数据顺序与输入数据顺序一致,使用单链表的尾插法,即在创建链表的时候使用一个一直指向尾节点的尾指针
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{//定义单链表的节点类型
int data; //每个节点存放一个数据元素
struct LNode *next;//指针指向下一个节点
}LNode,*LinkList;
LinkList List_TailInsert(LinkList &L){
int x;
L=(LinkList) malloc(sizeof (LNode));//创建头节点
L->next=NULL;
LNode *s,*r=L; //r为表尾指针
scanf("%d",&x); //输入节点的值
while(x!=9999){ //输入9999表示结束
s=(LNode *) malloc(sizeof(LNode));//在r节点后插入一个节点
s->data=x;
r->next=s;
r=s; //表尾指针指向新的表尾
scanf("%d",&x);
}
r->next=NULL; //表尾节点设置为空
return L;
}
void PrintLinkList(LinkList L){
//依次打印单链表的数据域的数据
LNode *p=L->next;
printf("单链表的元素依次为:");
while(p) {
printf("%d ", p->data);
p=p->next;
}
}
int main(){
LinkList L;
List_TailInsert(L);
PrintLinkList(L);
return 0;
}
二、单链表的头插法
单链表的头插法
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{//定义单链表的节点类型
int data; //每个节点存放一个数据元素
struct LNode *next;//指针指向下一个节点
}LNode,*LinkList;
LinkList List_HeadInsert(LinkList &L){
//头插法建立一个单链表
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));//创建初始头节点
L->next=NULL;//初始为空链表L->next=NULL
scanf("%d",&x);
while(x!=9999){ //表示输入9999结束
s=(LNode *)malloc(sizeof(LNode));//创建新节点
s->data=x;
s->next=L->next;
L->next=s; //将新节点插入表中
scanf("%d",&x);
}
return L;
}
void PrintLinkList(LinkList L){
//依次打印单链表的数据域的数据
LNode *p=L->next;
printf("单链表的元素依次为:");
while(p) {
printf("%d ", p->data);
p=p->next;
}
}
int main(){
LinkList L;
List_HeadInsert(L);
PrintLinkList(L);
return 0;
}
头插法的妙用
使用头插法得到一个链表的逆置
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{//定义单链表的节点类型
int data; //每个节点存放一个数据元素
struct LNode *next;//指针指向下一个节点
}LNode,*LinkList;
LinkList List_HeadInsert(LinkList &L){
//头插法建立一个单链表
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));//创建初始头节点
L->next=NULL;//初始为空链表L->next=NULL
scanf("%d",&x);
while(x!=9999){ //表示输入9999结束
s=(LNode *)malloc(sizeof(LNode));//创建新节点
s->data=x;
s->next=L->next;
L->next=s; //将新节点插入表中
scanf("%d",&x);
}
return L;
}
LinkList List_Inversion(LinkList L){
//利用头插法实现单链表的逆置
LinkList S=(LinkList) malloc(sizeof(LNode));
S->next=NULL;//初始化头节点为空
LNode *q,*p=L->next;
while(p!=NULL){
q=(LNode *) malloc(sizeof (LNode));
q->data=p->data;
q->next=S->next;
S->next=q;
p=p->next;
}
return S;
}
void PrintLinkList(LinkList L){
//依次打印单链表的数据域的数据
LNode *p=L->next;
printf("单链表的元素依次为:");
while(p) {
printf("%d ", p->data);
p=p->next;
}
}
int main(){
LinkList L;
List_HeadInsert(L);//头插法创建一个链表L
LinkList S;//存放链表L的逆置
PrintLinkList(L);
S=List_Inversion(L);
PrintLinkList(S);
return 0;
}