易混概念
结构体易混概念说明:
// 指针Polynomial指向struct PolyNode类型
struct PolyNode *Polynomial;
// 定义新的类型,它的类型是指向PolyNode的结构体指针
// typedef是给数据定义别名的,此处将PolyNode类型的指针定义别名为Polynomial
typedef struct PolyNode *Polynomial;
// 上面的等价为:
strucr PolyNode; //定义PolyNode数据类型
typedef PolyNode *Polynomial; //将PolyNode类型的指针定义别名为Polynomial
链表操作
利用C/C++实现一个链表的创建、长度计算、结点的插入操作。
#include<iostream>
#include<vector>
using namespace std;
typedef struct Node* List;
struct Node {
int data;
List Next;
};
struct Node L;
List Pointer;
//calculate length of list
int lengthRe(List Pt) {
List p = Pt;
int i = 0;
while (p) {
p = p->Next;
i++;
}
return i;
}
//link node
void linkNode(int data, List* lrear) {
List ptr;
ptr = new Node;
ptr->data = data;
ptr->Next = NULL;
(*lrear)->Next = ptr; //point new node
*lrear = ptr; //move *lrear to point ptr. So, we can add new node by *lrear.
}
//read list
List readList() {
List null_point;
List rear, temp;
int data;
int n;
//creat a null node
null_point = new Node;
null_point->Next = NULL;
rear = null_point;
cin >> n;
while (n--) {
cin >> data;
linkNode(data, &rear);
}
//delete first null node
temp = null_point;
null_point = null_point->Next;
delete temp;
return null_point;
}
int main() {
List listPoint;
int length1;
listPoint = readList();
length1 = lengthRe(listPoint);
cout << "List length of free: " << length1;
return 0;
}
链表应用
单链表逆序
本题主要实现将一个单链表翻转(不含头指针)。
//结构体链表定义
typedef struct Node *PtrToNode;
struct Node {
ElementType Data; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
// ptr指针用作移动指针,用于逐渐向后移动,
// singlePtr指针用于指向拆除的单个结点
// 在while循环中判断L是否为空,当不为空时则继续循环,将ptr指向的每个结点均拆除后翻转。
List Reverse( List L ){
List ptr;
List singlePtr;
ptr = L;
L = NULL;
while(ptr){
singlePtr = ptr;
ptr = ptr->Next;
singlePtr->Next = L;
L = singlePtr;
}
return L;
}
- 特别要注意的是,指针仅仅是指向关系;
- 如果两个指针指向同一位置,当一个指针的指向发生变化时,另一个指针的指向不会发生改变。
- 上述例子中的 L = NULL 尤为重要,否则 L 的后面可能还有其他结点,导致最终的结果出现错误。