#include<iostream>
using namespace std;
typedef struct Link
{
int elem;// 数据域
struct Link* next;//指针域
}link;
//链表的初始化
link* insetlink()
{
//创建头节点,并且准备一个指针指向头节点
link* p = new link;
link* temp = p;
//循环创建后续节点,并为节点赋值
for (int i = 1; i < 20; i++)
{
link* a = new link;
a->elem = i;
a->next = NULL;
temp->next = a;
temp = temp->next;
}
return p;
}
//插入节点
link* Add(link* p,int locate,int newelem)
{
//先创建一个零时节点接收头节点
link* temp = p;
link* add = NULL;
for (int i = 1; i < locate; i++)
{
if (temp == NULL)
{
cout << "插入位置无效!" << endl;
return p;
}
temp = temp->next;
}
add = new link;//创建新节点,并插入locate位置
add->elem = newelem;
//下面这两个位置不能交换,否则报错
add->next = temp->next;
temp->next = add;
return p;
}
//删除节点
link* deletelink(link* p, int locate)
{
link* temp = p;
link* del = NULL;
for (int i = 1;i < locate; i++)
{
if (temp == NULL)
{
cout << "删除位置失败!" << endl;
return p;
}
temp = temp->next;//移动节点
}
del = temp->next;
temp->next = temp->next->next;
free(del);//释放指针
return p;
}
//更改操作
link* changelink(link* p, int locate, int newelem)
{
link* temp = p;
link* newd = NULL;
for (int i = 1; i < locate; i++)
{
if (temp == NULL)
{
cout << "更改位置错误!" << endl;
return p;
}
temp = temp->next;
}
temp->elem = newelem;
//temp = temp->next;这一条也多了,不需要移动节点
return p;
}
//查找节点
link* seeklink(link* p, int seekelem)
{
link* temp = p;
int i = 1;
while (temp->next)
{
i++;
temp = temp->next;
if (temp->elem == seekelem)
{
cout << seekelem << "的位置是:" << i << endl;
break;
}
}
return p;
}
//循环输出链表内容
void output(link* p)
{
link* temp = p;
while (temp)
{
temp = temp->next;
cout << temp->elem << " ";
}
}
int main()
{
link* p;
//链表的初始化
p = insetlink();
//删除链表操作
p=deletelink(p, 10);
//查找操作
p = seeklink(p, 12);
//增加操作
p = Add(p,10,100);
//修改操作
p = changelink(p, 15, 105);
//输出
output(p);
return 0;
}
运行结果: