基础:结构体(struct)指针
定义:多个结点链接在一起的存储结构,其中每一结点都是同类结构体,包含两部分:数值域和指针域!--这是我自己总结的,欢迎大家来评论!
单链表:若一个链表中的每个结点都只包含一个指针域,称为单链表!
概念分析:
连续性--有别于树状结构
线 性--从一个结点到另一个结点链接存在顺序性-
静态单链表
#include<iostream> using namespace std; struct Node { /* 定义数值域和指针域 */ int data; Node *next; }; Node *head, *p, *r;//Node类型的三个指针:头指针、中间指针和尾指针 int main(){ cout<<"-未赋值时打印默认值-"<<head<<endl; head = new Node;//申请头结点地址 cout<<"-new之后指针head有真正的值-"<<head<<endl; cout << "-head的数值域默认值-" << head->data<< endl; cout << "-head的指针域的默认值-" << head->next<< endl; r = new Node;//申请尾结点地址 cout<<"-赋值之后r指针的值-"<<r<<endl; r->data = 999; /*静态单链表*/ p = new Node; cout<<"new之后指针p有真正的值"<<p<<endl; p->data = 123; /*----我是分割线-----以上代码是推演图1以下代码是推演图2-------------*/ p->next = r; head->next = p; cout << p << endl; cout << head->next << endl; cout << head->next->data << endl; cout << head->next->next->data<<endl; return 0; }
怎么理解呢?继续往下看!
-
上述代码推演
看上面的代码分割线之上的代码
开始推演图1
上图把head p和r三个指针都指向内存地址,其中p和r结点的数值域data各自有值,下面看推演图2 细看如何把三个结点链接在一起,如下:
除r结点之外,其他结点的指针域的值为下一个结点的地址!通过结构体指针把上面三个结点链接在一起!
若您看懂了,给我点个赞👍🏻哟! -
动态单链表
#include<iostream> using namespace std; struct Node { int data; Node *next; }; Node *head, *p, *r;//Node类型的三个指针:头指针、中间指针和尾指针 int x,y; int main(){ cin >> x; head = new Node;//动态申请头结点地址 r = head;//指针赋值,head和r指针指向为同一地址(上一行申请的内存地址) while (x != -1) { p = new Node;//循环申请新新结点p cin >> y; p ->data = y;//给p结点的数值域赋值 p ->next = NULL;//给p结点的指针域赋空值 /*----- 与其他结点进行关联-------去看下面的推演图-------- */ r ->next = p;//把p结点的地址赋值给r结点的next指针 r = p;//p结点的地址与r结点的地址相同 cin >> x; } p = head->next;//指针回溯到head->next(也就是非head节点的第一个节点) while (p->next != NULL) { /* 输出非尾结点的数值 */ cout << p->data <<" "; p = p->next;//通过节点的指针找下一个结点的地址 } cout << p->data << endl;//尾结点的数值 return 0; }
-
上述推演
注意上面代码中 分割线处
两个结点在while循环中建立链接
多次循环建立并链接更多结点!注意的是最后有两个指针都指向了最后一个结点--尾结点
您看懂了我推演的内容了吗?有问题,请评论或留言