运行截图:
下面是完整代码:
#include <iostream>
#include <stdio.h>
using namespace std;
/*链表结构体定义*/
typedef int ElemType;
struct List {
ElemType data;
struct List* next;
};
typedef struct List* list;
/*初始化无头结点单链表*/
bool f_initialize(list& L) {
L = NULL;
return true;
}
/*判断无头结点链表是否为空*/
bool f_judge(list& L) {
if (L == NULL) {
return true;
}
else {
return false;
}
}
/*头插法*/
list f_headinsert(list& L) {
L = (list)malloc(sizeof(List));
L->next = NULL;
ElemType x;
cout << "\n输入节点数据,-1表示结束输入:\n";
cin >> x;
while (x != -1) {
list p = (list)malloc(sizeof(List));
p->data = x;
p->next = L->next;
L->next = p;
cout << "输入节点数据\n";
cin >> x;
}
return L;
}
/*尾插法*/
list f_endinsert(list& L) {
L = (list)malloc(sizeof(List));
L->next = NULL;
list m = L;
ElemType x;
cout << "\n输入节点数据,-1表示结束输入:\n";
cin >> x;
while (x != -1) {
list p = (list)malloc(sizeof(List));
p->data = x;
p->next = NULL;
m->next = p;
m = p;
cout << "输入节点数据\n";
cin >> x;
}
return L;
}
/*遍历链表*/
void fs_bl(list& L) { //注意,遍历时一定不能用原指针,不然,遍历两次时,会因为指针报错
list p = L;
while (p->next != NULL) {
cout << p->next->data << "->";
p= p->next;
}
cout << "NULL"<<endl;
}
/*根据值删除*/
void value_delete(list& L, int k) {
list p = L;
while (p->next) {
if (p->next->data == k) {
list t = p->next;
p->next = t->next;
free(t);
}
p = p->next;
}
}
/*根据位置删除*/
void position_delete(list& L, int k) {
list p = L;
if (p == NULL) {
cout << "链表为空" << endl;
return;
}
if (k < 0) {
cout << "要删除的位置错误,数值应该>=0" << endl;
return;
}
int i=0;
while (p->next != NULL && i < k-1) {
p = p->next;
i++;
}
list t = p->next;
p->next = p->next->next;
free(t);
//return L;
}
/*根据值查询*/
void value_find(list& L, int k) {
list p = L->next;
int i = 0;
while (p) {
i++;
if (p->data == k) {
cout << "值" << k << "在链表中的位置是:" << i << endl;
}
p = p->next;
}
}
/*根据位置查询*/
void position_find(list& L, int k) {
list p = L;
if (k < 0) {
cout << "要删除的位置错误,数值应该>=0" << endl;
return;
}
int i = 0;
while (p->next!=NULL && i<k){
p = p->next;
i++;
}
cout << "位置" << k << "在链表中的值是:" << p->data<<endl;
}
/*插入指定位置*/
void position_insert(list& L, int k) {
ElemType x;
list p = L;
int i = 0;
if (k < 0) {
cout << "要删除的位置错误,数值应该>=0" << endl;
return;
}
while (p->next != NULL && i < k-1) {
p = p->next;
i++;
}
list m = (list)malloc(sizeof(List));
cout << "\n 输入新增节点的值:";
cin >> x;
m->data = x;
m->next = p->next;
p->next = m;
//return L;
}
/*链表节点数*/
void len(list& L) {
int i = 0;
list p = L->next;
while (p) {
i++;
p = p->next;
}
cout << "一共有" << i << "个节点\n";
}
int main() {
list l;
int n;
ElemType m;
f_initialize(l);
l=f_headinsert(l);
fs_bl(l);
cout << endl;
cout << "输入删除的节点位置:";
cin >> n;
position_delete(l, n);
fs_bl(l);
cout << endl;
cout << "输入删除的节点值:";
cin >> m;
value_delete(l,m);
fs_bl(l);
cout << endl;
cout << "输入查询的节点位置:";
cin >> n;
position_find(l, n);
fs_bl(l);
cout << endl;
cout << "输入查询的节点值:";
cin >> m;
value_find(l, m);
fs_bl(l);
cout << endl;
cout << "输入插入的节点位置:";
cin >> n;
position_insert(l, n);
fs_bl(l);
cout << endl;
len(l);
return 0;
}