数据结构 - 结构体/链表

易混概念

结构体易混概念说明:

// 指针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 的后面可能还有其他结点,导致最终的结果出现错误。

猜你喜欢

转载自blog.csdn.net/qq_38844835/article/details/119065414
今日推荐