一、生成链表
1、由键盘输入数据,使用后插法新增链表数据
(数据类型设定为int)
链表结构体
typedef struct LNode {
int data;
struct LNode *next;
}LNode, *LinkList;
主要函数代码:ListInsert(LinkList &L)
LinkList ListInsert(LinkList &L) {
L = (LinkList)malloc(sizeof(LNode));
LNode *s, *r = L;
int x;
cout << "input int number:(9999 for end)" << endl;
cin >> x;
//后插建立新链表
while(x != 9999) {
s = (LNode *)malloc(sizeof(LNode)); //新建立一个结点存放输入数据
s->data = x;
r->next = s; //原尾结点指向新结点
r = s;
cin >> x;
}
r->next = NULL; //尾结点指针指向空
return L;
}
二、删除单链表元素
1、删除带头结点的有序单链表中重复的数据元素
bool Link_delSame(LinkList &L) {
if (L->next == NULL) { //链空
return false;
}
int num = L->next->data; //num:存放已读链表最后一个未重复指针
LinkList p = L->next;
LNode *q; //存放被删结点后的指针
while (p->next != NULL) {
//若下一个数不是重复出现
if (p->next->data != num) {
p = p->next;
num = p->data;
}
//下一个数为相同重复出现的数
else {
q = p->next;
p->next = q->next;
free(q);
}
}
return true;
}
三、输出链表数据
1、正向输出
int coutLink(LinkList &L) {
if (L->next == NULL) {
return -1;
}
LNode *p = L;
while (p->next != NULL) {
cout << p->next->data << '\t';
p = p->next;
}
cout << endl;
return 0;
}
2、逆向输出
int R_coutLink(LinkList &L) {
if (L->next != NULL) {
R_coutLink(L->next);
}
if (L != NULL) {
cout << L->data << '\t';
}
return 0;
}
//main函数中
if (L->next != NULL) {
R_coutLink(L->next);
}
四、数据测试
1、删除带头结点的有序单链表中重复的数据元素
输入数据:
输出结果:
2、逆向输出链表内容:
五、 问题
1、E0513 不能将 “LNode *” 类型的值分配到 “LNode *” 类型的实体
typedef struct {
int data;
struct LNode *next;
}LNode, *LinkList;
已经用到LNode,但是前面没有出现,可改为
typedef struct LNode {
}LNode, *LinkList;
或者
typedef struct LNode LNode {
} *LinkList;
2、逆向输出,编译没有报错,输出结果最后一位出错
原因:链表是带头结点的,头结点不存放数据,但是被输出了
//错误
R_coutLink(L);
//正确
if (L->next != NULL) {
R_coutLink(L->next);
}