1.单链表结构体声明
typedef struct LNode {
int data;
struct LNode *next;
}LNode,*LinkList;
为什么为什么next是struct LNode类型:
在链表数据结构中,每个节点都包含一个数据域和一个指向下一个节点的指针。因为链表是由节点组成的,每个节点都需要知道下一个
节点在哪里,所以在结构体中需要包含一个指向下一个节点的指针
LNode*与LinkList的区别:
本质无区别,LNode*理解为强调是一个结点,LinkList强调指向链表的指针
2.单链表初始化+尾插+头插逆序输出(带头节点)
#include <cstdlib>
#include <stdio.h>
#define sum 100
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList initList(LinkList &L){
L = (LinkList)malloc(sizeof(LinkList));
L->next = NULL;
return L;
}
LinkList insert(LinkList &L){
LNode *q = L;
int a = 10;
printf("请输入:");
scanf("%d",&a);
while (a!=-1) {
LNode *p = (LNode*)malloc(sizeof(LNode));
p->data = a;
q->next = p;
q = p;
printf("请输入:");
scanf("%d",&a);
}
q->next = NULL;
return L;
}
LinkList reserve(LinkList &L,LinkList &A){
initList(A);
LNode *p = L->next;
while (p!=NULL) {
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = p->data;
s->next = A->next;
A->next = s;
p = p->next;
}
return A;
}
void printLinkList(LinkList &L){
LNode *p = L->next;
while (p!=NULL) {
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
int main(){
LinkList L;
LinkList A;
initList(L);
insert(L);
printLinkList(L);
reserve(L,A);
printLinkList(A);
return 0;
}
单链表尾插(不带头结点)
LinkList initList() {
return NULL;
}
LinkList insert(LinkList L) {
LNode *p = NULL;
LNode *q = NULL;
int a;
printf("请输入:");
scanf("%d", &a);
while (a != -1) {
p = (LNode*)malloc(sizeof(LNode));
p->data = a;
p->next = NULL;
if (L == NULL) {
L = p;
} else {
q->next = p;
}
q = p;
printf("请输入:");
scanf("%d", &a);
}
return L;
}
表头、表尾、表中插入删除元素,要考虑空指针异常