定义结点
typedef struct LNode{
int data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
单链表初始化
带头结点初始化
bool InitList(LinkList &L){
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
return true;
}
不带头节点初始化
bool InitList(LinkList &L){
L = NULL;
return true;
}
建立单链表
头插法
带头结点的头插法建立单链表
LinkList List_HeadInsert(LinkList &L){ //逆向建立单链表
LNode *s;
int x;
L = (LNode*)malloc(sizeof(LNode)); //创建头结点
L->next = NULL; //初始化为空链表
scanf("%d",&x); //插入结点的值
while(x!=999){
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s; //将新结点插入表中,L为头指针
scanf("%d",&x);
}
return L;
}
不带头结点的头插法建立单链表
LinkList List_HeadInsert(LinkList &L){
LNode *s; //要插入的结点
int x;
scanf("%d",&x);
while(x!=999){
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s-next = NULL;
if(*L == NULL){
*L = s; //将新结点位于首结点
}else{
s->next = *L;
*L = s; //用*L代表第一个结点,这样就使s结点添加到了L链表的首部,s结点的下一个指向之前L的第一个结点
}
scanf("%d",&x);
}
return L;
}
尾插法
带头结点的尾插法建立单链表
LinkList List_TailInsert(LinkList &L){ //正向建立单链表
int x;
L = (LNode*)malloc(sizeof(LNode)); //创建头结点
LNode *s,*r = L; //r为表尾指针
scanf("%d",&x);
while(x!=999){
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s; //在r结点后插入s
r = s; //让r继续成为表尾指针
scanf("%d",&x);
}
r->next = NULL; //结束插入后,将表尾的下一个指向空
return L;
}
不带头结点的尾插法建立单链表
LinkList List_TailInsert(LinkList &L){
int x;
LNode *s,*r; //创建头尾指针
scanf("%d",&x);
while(x!=999){
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
if(*L == NULL){ //若为空链表
*L = s;
r = *L;
}else{ //不为空链表
r->next = s;
r = s;
}
scanf("%d",&x);
}
r->next = NULL;
return L
}