再次认识指针(主要是对二级指针的重新认识)
概述
源自一道题目
一开始是用map写的,最后一个点一直不过,
不知道啥情况,map学的很表面,以后有机会补充。
然后就试了一下通过链表遍历,竟然过了。
上代码:
#include<iostream>
#include<algorithm>
typedef struct Node* LinkList;
struct Node {
int data;
LinkList Next;
};
using namespace std;
LinkList CreatLinkList();
LinkList Find(LinkList L1, LinkList L2);
void Insert(LinkList* head, LinkList* tail, int n);
//LinkList*==struct Node**,是指向指针的指针,所以就传入指针的地址
//二级指针指向的是“一级指针的地址”
void Print(LinkList L);
int main()
{
LinkList L1, L2;
L1 = CreatLinkList();
L2 = CreatLinkList();
LinkList L3=Find(L1, L2);
Print(L3);
return 0;
}
void Print(LinkList L)
{
int flag = 0;
while (L) {
if (flag) cout << " ";
flag = 1;
cout << L->data ;
L = L->Next;
}
if (flag == 0) cout << "NULL";
return;
}
void Insert(LinkList *head,LinkList *tail,int n)
{
LinkList temp = (LinkList)malloc(sizeof(struct Node));
//假c++,可能会出现兼容性问题,不要这么写,非常不好的习惯
temp->Next = NULL;
temp->data = n;
if (*head == NULL) *head = temp;
else (*tail)->Next = temp;
(*tail) = temp;
}
LinkList Find(LinkList L1, LinkList L2)
{
LinkList p1 = L1, p2 = L2,head=NULL,tail=NULL;//L3链表
while (p1 && p2)//两个都有节点的时候才可以比较
{
if (p1->data == p2->data)
{
Insert(&head, &tail, p1->data);
p1 = p1->Next, p2 = p2->Next;
}
else if (p1->data < p2->data)
p1 = p1->Next;
else if (p1->data > p2->data)
p2 = p2->Next;
}
return head;
}
LinkList CreatLinkList()
{
LinkList head = NULL, tail = NULL;
int n;
while (1)
{
cin >> n;
if (n == -1) return head;
Insert(&head, &tail, n);
}
return head;
}
主要问题出在这个函数上:
因为函数的作用是在这条链表上添加节点(这里传入的是首节点,一般来说是弄个头指针指向首节点,但是我感觉这样遍历的时候还要把链表往后一个节点才可以到首节点,暂时没发现这有什么有点就不管头结点了),如果我传入的是head,就是没有用到二级指针,那么相当于我在函数里面指数修改传入的形参,而不能改变主函数里实参(head)首节点(这块果然还是弄个头结点比较好说明)
简单来说就是,想要改变链表首节点的指向必须得传入首届点的地址。

然后第二个问题出现了:
这一块到底怎么写,一开始我写的是Insert(*&head, &tail, n);
但是我本来head和tail就是指针,我只要把指针的地址传进去就行,加个地址符好就好,emmm当时写的时候为什么要加,脑壳知道有毛病。

反正问题都出来了,就顺便再深入了解一下二级指针
二级指针
二级指针也是一个变量,它 指向的一定是“指针的地址”。一级指针指向的是普通变量的地址,二级指针指向的是“一级指针的地址”。
浙公网安备 33010602011771号