嘿嘿,这么快就写第二篇了。
首先是一些定义和头文件。
#include <iostream>
#include "stdio.h"
using namespace std;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 2
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode;
typedef LNode *LinkList; // 定义链表节点
这个是mian函数,里边用到的函数我在另外写出来。
int main()
{
int choice; // 选择功能
LinkList p; // 结构体指针
int cnt, index;
ElemType e;
cout << "首先初始化链表,请输入你想初始化的节点个数\t";
cin >> cnt;
cout << "请输入节点的值" << endl;
p = InitLinkList(cnt);
printLink();
while(cin >> choice)
{
switch(choice)
{
case 1:
cout << "请输入你想初始化的节点个数\t";
cin >> cnt;
p = InitLinkList(cnt);
cout << "初始化完成" << endl;
break;
case 2:
cout << "请输入index 和 e的值" << endl;
cin >> index >> e;
LinkInsert(p, index, e);
break;
case 3:
cout << "请输入index的值" << endl;
cin >> index;
break;
case 4:
cout << "请输入index的值" << endl;
cin >> index;
LinkDelete(p, index, &e);
cout << "删除掉的节点的值为:" << e << endl;
break;
case 5:
cout << "打印成功" << endl;
printLinkList(p);
break;
case 6:
cout << "正在删除链表" << endl;
DestotyLink(p);
break;
}
cout << endl;
printLink();
}
其中几个函数的实现我写在下边:
首先是初始化函数:
函数接受一个int型参数,返回一个链表的头指针(并非头节点);
LinkList InitLinkList(int n)
{
LinkList L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
for(int i = 0; i < n; i++)
{
LinkList p = (LinkList)malloc(sizeof(LNode));
p->next = L->next;
L->next = p;
ElemType e;
cin >> e;
p->data = e;
}
cout << "初始化成功啦" << endl;
return L;
}
接下来是LinkGetElem函数
三个参数,第一个是结构体指针,第二个是访问的元素,第三个用来保存查找到的元素的值。
Status LinkGetElem(LinkList L, int i, ElemType *e)
{
int j;
LinkList p;
p = L->next;
for(j = 0; j < i && p; ++j)
{
p = p->next;
}
if(!p || j > i)
{
cout << "查找错误" << endl;
return ERROR;
}
*e = p->data;
cout << "查找成功" << endl;
return OK;
}
这是LinkInsert函数,用来插入节点
Status LinkInsert(LinkList L, int i, ElemType e)
{
int j;
LinkList s;
s = L->next; //指向第0个节点
LinkList p = (LinkList)malloc(sizeof(LNode));
for(j = 0; j < i && p; ++j)
L = L->next;
if(!p || j > i)
{
cout << "插入出错啦" << endl;
}
p->next = L->next;
p->data = e;
L->next = p;
cout << "插入成功" << endl;
return OK;
}
LinkDelete函数
Status LinkDelete(LinkList L, int i,ElemType *e)
{
int j;
LinkList p, s;
s = L;
p = L->next;
for(j = 0; j < i && p; j++)
{
s = p;
p = p->next;
}
if(!p || j > i)
{
cout << "删除出错啦" << endl;
return ERROR;
}
s->next = p->next;
*e = p->data;
free(p);
cout << "删除节点成功啦" << endl;
return OK;
}
接下来是Destory函数,这个函数用来删出整个链表。
void DestotyLink(LinkList L)
{
LinkList p;
p = L->next;
while(p)
{
L->next = p->next;
cout << "链表正在删除\t" << p->data << endl;
free(p);
p = L->next;
}
cout << "删除成功" << endl;
}
下边是打印功能函数:
// 打印功能
void printLink()
{
cout << "您正在使用链表" << endl
<< "输入1 初始化链表" << endl
<< "输入2 将元素插入链表" << endl
<< "输入3 获取index位置的元素的值" << endl
<< "输入4 删除指定位置的元素" << endl
<< "输入5 打印链表" << endl
<< "输入6 删除整个链表" << endl;
}
// 打印整个链表
void printLinkList(LinkList L)
{
LinkList p = L->next;
if(!p)
{
cout << "链表为空" << endl;
return;
}
while(p)
{
cout << "链表的元素为" << p->data << "\t";
p = p->next;
}
cout << endl;
}
好了就先到这啦,加油加油