#define OVERFLOW -1
#define OK 1
#define ERROR 0
typedef int Status;
using namespace std;
/* 定义链表节点 */
typedef struct Node
{
int data;
struct Node *next;
}Node, *LinkList;
/* 初始化链表,即安排一个头结点 */
Status init(LinkList &l)
{
l = (LinkList)malloc(sizeof(Node));
if(!l)exit(OVERFLOW);
l ->next = NULL;
return OK;
}
/* 添加一个节点在头部后面 */
Status addNode(LinkList &l, int data)
{
if(l == NULL)init(l);
Node *n = NULL;
init(n);
n ->data = data;
n ->next = l ->next;
l ->next = n;
printf("%s/n", "节点添加成功!");
return OK;
}
/* 得到链表的长度 */
int getLength(LinkList &l)
{
int length = 0;
if(l == NULL || l ->next == NULL)return length;
Node *n = l ->next;
while(n != NULL)
{
++length;
n = n ->next;
}
return length;
}
/* 在链表的某个位置插入一个元素,前提是链表中已经有节点 */
Status insertNode(LinkList &l, int position, int data)
{
int length = getLength(l);
if(position < 1 || position > length)
{
printf("%s/n", "保证链表存在结点才可以插入!");
return ERROR;
}
int curPosition = 0;
Node *n= l;
while(n != NULL && curPosition < position - 1)
{
n = n ->next;
++curPosition;
}
// 此时的n正好是即将插入的位置的之前节点
Node *insertNode = (Node*)malloc(sizeof(Node));
if(!insertNode)exit(OVERFLOW);
insertNode ->data = data;
insertNode ->next = n ->next;
n ->next = insertNode;
printf("%s/n", "插入成功!");
return OK;
}
/* 从链表上删除某位置的节点,并且用data返回对应节点的数据 */
Status deleteNode(LinkList &l, int position, int &data)
{
int length = getLength(l);
if(position < 1 || position > length)
{
printf("%s/n", "保证链表存在结点才可以删除!");
return ERROR;
}
int curPosition = 0;
Node *n= l;
while(n != NULL && curPosition < position - 1)
{
n = n ->next;
++curPosition;
}
// 此时的n正好是即将删除的位置的之前节点
Node *deleNode = n ->next;
n ->next = n ->next ->next;
data = deleNode ->data;
free(deleNode);
printf("%s%d/n", "删除成功,删除节点的数据为:", data);
return OK;
}
/* 打印链表 */
void print(LinkList &l)
{
if(l == NULL)
{
printf("%s/n", "链表还没有初始化!");
return;
}
if( l ->next == NULL)
{
printf("%s/n", "链表只有头结点!");
return;
}
Node *n = l ->next;
while(n != NULL)
{
printf("%d -> ", n ->data);
n = n ->next;
}
printf("%s/n", "");
}
/* 主函数,操作 */
void main()
{
LinkList list = NULL;
int r = -1;
while(r != 0)
{
printf("%s/n", "1:初始化链表");
printf("%s/n", "2:在头部后面添加一个节点");
printf("%s/n", "3:打印链表");
printf("%s/n", "4:在位置i添加节点");
printf("%s/n", "5:删除位置i上的节点");
scanf("%d", &r);
switch(r)
{
case 1:
init(list);
printf("%s/n", "初始化完毕!");
break;
case 2:
int data;
printf("%s", "请输入节点数据:");
scanf("%d", &data);
addNode(list, data);
break;
case 3:
print(list);
break;
case 4:
int position;
printf("%s", "请输入位置和数据(空格隔开):");
scanf("%d%d", &position, &data);
insertNode(list, position, data);
break;
case 5:
int delPosition;
printf("%s", "请输入位置:");
scanf("%d", &delPosition);
deleteNode(list, delPosition, data);
break;
}
}
}