赞
踩
目录
逻辑次序和物理次序不一定相同
元素之间的逻辑关系用指针表示
举例:(a1,a2,a3,a4)的存储示意图
存储信息的这个单元我们称之为结点,一个结点包括数据域(存储当前信息)和指针域(存储下一结点的地址)。
单链表是由若干结点构成的,单链表的结点只有一个指针域:
单链表的结点结构:
- typedef struct node{
- Datatype data; //数据域
- struct node *next; //指针域
- }Node,*Link; //*Link:指向结构体的指针
使用typedef定义,Node,和*Link就相当于声明了一个类型
Node st : 等价于 struct node st;
Link p : 等价于 struct node *p;
p = (Link) malloc(sizeof(Node));
等价于:
p = (struct node *) malloc(sizeof(Node))
- //申请一个结点
- Link p;
- p = (Link)malloc(sizeof(Node));
- //引用数据元素
- (*p).data
- p -> data
- //引用指针域
- (*p).next
- p -> next
重点在数据元素之间的逻辑关系表示,将实际存储地址抽象
将空表与非空表进行统一处理:头结点
操作接口:void displayNode(Link head);
- void displayNode(Link head){
- p = head -> next;
- while(p!=NULL){
- printf("%d",p->data);
- p = p->next;
- }
- }
操作接口:int length(Link head);
- int length(Link head){
- p = head->next;
- count = 0;
- while(p != NULL){
- p=p->next;
- count++;
- }
- return count;
- }
操作接口: int queryNode(Link head,DataType x);
- int queryNode(Link head,DataType x){
- p = head->next;
- while(p!=NULL){
- if(p->data==x){
- print(data);
- return ture;
- }
- p=p->next;
- }
- return false; //没有找到
- }
操作接口:void inserNode(Link head,int i,dataType x);
结点ai-1、x和ai之间的逻辑关系
边界情况:表头、表尾
算法描述
- bool insertNode(Link head,int i,DataType x){
- p = head; //工作指针指向头结点
- count = 0;
- while(p!=NULL & count <i-1){
- p = p->next;
- count++;
- }
- if(p == NULL){
- return false; //没有找到第i个节点
- }else{
- node = (Link)malloc(sizeof(Node)); //申请一个结点
- node->data = x;
- node->next = p->next;
- p->next = node;
- return true;
- }
- }
操作接口: Link newList(Datatype a[],int n);
头插法:将插入的结点插在头结点的后面
插入第一个结点:
特点:头插法的顺序与数组顺序相反
- template <calss DataType>
- Link newList(DataType a[],int n){
- //创建头结点
- head = (Link)malloc(sizeof(Node));
- head->next = NULL;
- //创建后续结点
- for(int i = 0;i<n;i++){
- node = (Link)malloc(sizeof(Node));
- node->data = a[i];
- node->next = head->next;
- head-next = node;
- }
- return head;
- }
操作接口:Link newList(Datatype a[],int n);
尾插法:将待插入的结点插在终端结点的后面
- Link newList(DataType a[],int n){
- head = (Link)malloc(sizeof(Node)); //生成头结点
- head->next = NULL;
- rear = head; //初始化尾结点
- for(int i = 0;i<n;i++){
- node = (Link)malloc(sizeof(Node));
- node->data = a[i];
- rear->next = node;
- /*node->next = NULL;*/
- rear = node;
- }
- rear->next = NULL;
- return head;
- }
操作接口:bool deleteNode(Link head,DataType x);
正在上传…重新上传取消
算法描述:
- q-next = p->next;
- free(p);
空表情况,判断
- if(head = NULL ||head->next = NULL){ //空表
- return false;
- }
正在上传…重新上传取消
- bool deleteNode(Link head,DataType x){
- if(head->next=NULL || head=NULL){ //空表,或者链表中没有数据
- return false;
- }
- p=head->next; //初始化p,q
- q=p->head;
- while(p!=NULL){
- if(p->data == x){
- q->next = p->next;
- free(p);
- return true;
- }else{
- q=p;
- p=p->next;
- }
- }
- return flase;
- }
可以找到p的前驱结点
快速找出前驱
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。