#include <stdlib.h>
#include<iostream>
using namespace std;//在头文件之后
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;
typedef struct Node {
ElemType data;
struct Node* next;
}Node;
typedef struct Node* LinkList;
//表的创建(头插法)
void CreateListHead(LinkList* L, int m[], int n) {
LinkList p;
int i;
*L = new Node;
(*L)->next = NULL;
for (i = 0;i < n;i++) {
p = new Node;
p->data = m[i];
p->next = (*L)->next;
(*L)->next = p;
}
}
//表的创建(尾插法)
void CreateListTail(LinkList* L, int m[], int n) {
LinkList p, r;
int i;
*L = new Node;
r = *L;
for (i = 0;i < n;i++) {
p = new Node;
p->data = m[i];
r->next = p;
r = p;
}
r->next = NULL;
}
//获取元素的操作
Status GetElem(LinkList L, int i, ElemType &e) {
int j;
LinkList p;
p = L->next;
j = 1;
while (p && j < i) {
p = p->next;
++j;
}
if (!p || j > i) {
return ERROR;
}
e = p->data;
return OK;
}
//插入元素的操作
Status ListInsert(LinkList* L, int i, ElemType e) {
int j;
LinkList p, s;
p = *L;
j = 1;
while (p && j < i) {
p = p->next;
++j;
}
if (!p || j > i) {
return ERROR;
}
s = new Node;
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
//删除元素的操作
Status ListDelete(LinkList* L, int i) {
int j;
LinkList p, q;
p = *L;
j = 1;
while (p->next && j < i) {
p = p->next;
++j;
}
if (!(p->next) || j > i) {
return ERROR;
}
q = p->next;
p->next = q->next;
delete(q);
return OK;
}
//输出链表中的元素
Status Output(LinkList L) {
LinkList p;
p = L->next;
while (p) {
cout << p->data << endl;
p = p->next;
}
return OK;
}
int main()
{
LinkList L;
int i, k, j, n, e, m[1000];
cout << "请输入元素个数" <<endl ;
cin >> n;
cout << "请输入各个元素的值" << endl;
for (i = 0;i < n;i++) {
cin >> m[i];
}
CreateListTail(&L, m, n);
cout << "创建的链表为:" << endl;
Output(L);
cout << "请输入要获取第j个元素并返回到e值中(输入j的值):" << endl;
cin >> j;
GetElem(L, j, e);
cout << "此时e的值为第j个元素值:" <<e<< endl;
cout << "请输入在第k个元素前插入一个元素e1:" << endl;
int e1;
cin >> k;
cin >> e1;
ListInsert(&L, k, e1);
cout << "此时链表的各元素如下" << endl;
Output(L);
cout << "请输入要删除链表中的第几个元素:" << endl;
int l;
cin >> l;
ListDelete(&L, l);
cout << "此时链表的各元素如下:" << endl;
Output(L);
return 0;
}
//可以对主函数部分进行修改,来使得这个线性表更加人性化,考虑使用switch语句来构建一个操作菜单