今天小学了一会c++链表,在解决头插法创建链表问题的时候,发现我创建的结构体头指针head老是提示未初始化,
这个时候就疯狂卡死在这,本以为错误的是Node* head;
这句话,于是思考怎么给它初始化,后面经朋友点拨,说是要在void inserthead(Node* l) {
的头指针形参前加上引用符号&,结果一试发现还真行。
但是问题是解决了,为什么呢?
传递进来的是结构体指针,按道理说指针传递会修改的,于是查询资料,终于明白了。
此处插上链接:https://blog.csdn.net/c991262331/article/details/83274525
https://blog.csdn.net/yhblog/article/details/100829793
如果不加引用,就是无效的传递。
在c语言中实参和形参之间的数据传输是单向的“值传递”方式,也就是实参可以影响形参,而形参不能影响实参。指针变量作为参数也不例外,但是可以改变实参指针变量所指向的变量的值。
然后在解决删除链表的倒数第n个节点问题时,遇到一个愚蠢的问题,导致结果始终不出来。
就是`Node* temp = p->next; 和p->next = p->next->next; 这两句话交换了位置,本来temp就是为了保存被删除节点的指针,防止丢失,如果一交换,temp根本没起作用,所以错误。
此处贴上全部代码吧。方便自己查阅。
# include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
};
void inserthead(Node*&l) {
l = new Node();
l->next = NULL;
int x;
while (cin >> x && x != 9999) {
Node* temp = new Node();
temp->data = x;
temp->next = l->next;
l->next = temp;
}
}
void destroy(Node* l) {
Node* p = l->next;
while (p) {
Node* temp = p->next;
p->next = NULL;
delete p;
p = temp;
}
l->next = NULL;
delete l;
}
int Nodelong(Node *l) {
Node* p = l->next;
int num = 0;
while (p && p->data != 0) {
num++;
p = p->next;
}
return num;
}
int main()
{
Node* head;
inserthead(head);
int length = Nodelong(head);
Node* p = head->next;
int n;
cin >> n;
int m = 1;
while (p && p->data != 0) {
if (m == (length - n)) {
Node* temp = p->next;
p->next = p->next->next;
delete temp;
}
m++;
p = p->next;
}
Node* q = head->next;
while (q && q->data != 0) {
cout << q->data << " ";
q = q->next;
}
}