已经有一个链表,现在可以做以下两种操作
1 a b,表示在第a个元素后面插入b
2 a 表示删除第a个元素
#include<iostream>
using namespace std;
typedef struct LinkList {
int val;
LinkList* next;
}Linklist;
int c;
//在链表中添加元素
void addList(Linklist* list, int& a, int& b) {
int k = a-1;
Linklist* curr = list;
while (k--) {
curr = curr->next;
}
if (a == c) { //若是最后一个节点,不要忘记在添加新节点后其指向的下一个节点要置空
Linklist* newlist = new Linklist;
newlist->val = b;
curr->next = newlist;
newlist->next = NULL;
}
else {
Linklist* newlist = new Linklist;
newlist->val = b;
newlist->next = curr->next;
curr->next = newlist;
}
}
//在链表中删除元素
void delList(Linklist* list, int& a) {
Linklist* curr = list;
int k = a-2;
while (k--) {
curr = curr->next;
}
if (a == c) { //如果是最后一个节点的话直接前面的节点指向的下一个节点为NULL
curr->next = NULL;
}
else {
curr->next = curr->next->next;
}
}
int main() {
int n, q;
int num, flag;
int a, b;
//int count = 0;//表示链表的长度
cin >> n >>q;
cin >> num;
Linklist* list = new Linklist;
Linklist* curr = list;
c++;
curr->val = num;
n = n - 1;
while (n--) {
cin >> num;
curr->next = new Linklist;
c++;
curr = curr->next;
curr->val = num;
}
curr->next = NULL;
while (q--) {
cin >> flag;
if (flag == 1) {
cin >> a >> b;
if (a <= c) {
addList(list, a, b);
c++;
}
}
else if(flag==2){
cin >> a;
if (a <= c) {
delList(list, a);
c--;
}
}
}
curr = list;
while ( c>1 ) {
cout << curr->val;
cout << " ";
curr = curr->next;
c--;
}
cout << curr->val;
//防止内存泄露
delete list;
list = NULL;
delete curr;
curr = NULL;
return 0;
}
/*
补充:在C和C++中 struct和typedef struct的各自区别
在C语言中
如果是直接定义结构体的话,在定义变量的时候需要加上结构体这个标志符
struct Linklist {
int val;
int b;
};
struct Linklist stu;
而
typedef struct Linklist {
int val;
int b;
}list; //list 是这个结构体的别名
直接 list stu;
在C++中就没有这么麻烦,但是也有区别
struct Linklist {
int val;
int b;
}list; //list是变量名,可直接使用
list.val = 4;
或者 Linklist stu; 然后再给变量赋值
而
typedef struct Linklist {
int val;
int b;
}list; //list 是这个结构体的别名
必须要先定义变量 list stu;
stu.val = 3;
*/