C语言基础(第四更)

C语言基础(第四更)

指针(重点)

指针是一块内存的地址,常用于函数改变实参以及链表中

指针的使用比较灵活

定义方式

//示例
#include<stdio.h>
int main(){
    int a;
    int *p=NULL;
    p=&a;
    return 0;
}

结构体(重点)

有时程序中会使用一些数据来表示一个物体的属性,这个时候再用普通的变量就不再方便

定义方式

#include<stdio.h>
struct x{
    int a;
    int b;
};//x是结构体类型,a,b是x类型结构体的属性
//链表中属性可以使任意类型甚至新的结构体(非自身类型)
struct y{
    struct x a;
    int b;
};
int main(){
    struct x a;//定义结构体变量a
    a.a=1;
    a.b=2;//属性值
    struct y b;
    b.a.a=1;
    b.a.b=2;
    b.b=3;
    return 0;
}

链表(重点)

有时会遇到一连串的有序数据进行增删或反复检索,使用数组已经不在方便(时间复杂度高)

链表是一组有关联的特殊的结构体,一个结构体即一个节点

相关函数:

(/*类型名*/ *)malloc(内存大小),分配一个特定类型的内存并返回指向这块内存的指针

free(/*(指针)地址*/),释放指针所指的内存

头文件:stdlib.h / malloc.h

//示例
#include<stdio.h>
struct link(){
    int data;
    struct link *next;//指向下一个节点(地址)
};//一般情况
int main(){
    return ;
}

单链表的建立

单链表有两个属性:数据集和一个指针

数据集内容是任意的

//示例
#include<stdio.h>
struct link(){
    int data;
    struct link *next;//指向下一个节点
};
void *add(struct link *head);
int main(){
    int n;scanf("%d\n");
    for(int i=0;i<n;i++){
        head=add(head);
    }
    return ;
}
void *add(struct link *head){
    struct link *p=head,*pr=NULL;
    pr=(struct link *)malloc(sizeof(struct link));//为新节点分配内存
    if(pr==NULL)exit(0);//分配失败,结束程序
    if(head==NULL){
        head=pr;
    }
    else{
        while(p->next!=NULL){
			p=p->next;
        }
        p->next=pr;
    }
    pr->next=NULL;
    int data;
    scanf("%d",&data);
    pr->data=data;
    return head;
}

双链表双链表的建立

双链表也有两个属性:数据集和两个指针

数据集内容是任意的

//示例
#include<stdio.h>
struct link(){
    int data;
    struct link *last//指向上一个节点
    struct link *next;//指向下一个节点
};
void *add(struct link *head);
int main(){
    int n;scanf("%d\n");
    for(int i=0;i<n;i++){
        head=add(head);
    }
    return ;
}
void *add(struct link *head){
    struct link *p=head,*pr=NULL;
    pr=(struct link *)malloc(sizeof(struct link));//为新节点分配内存
    if(pr==NULL)exit(0);//分配失败,结束程序
    if(head==NULL){
        head=pr;
        head->last=NULL;
    }
    else{
        while(p->next!=NULL){
			p=p->next;
        }
        p->next=pr;
    }
    pr->next=NULL;
    pr->last=p;
    int data;
    scanf("%d",&data);
    pr->data=data;
    return head;
}

删除和插入操作

有时会往一组数据(链表)中特定位置插入数据

//单链表的删除
struct link{
    int data;
    struct link *NEXT;
};//结构体类型
//last为上一个的地址,next为下一个的地址,p是指定节点的地址
//三者关系为:last->NEXT=p,p->NEXT=next
last->NEXT=next;
free(p);//释放内存
/************/
//双链表的删除
struct link{
    int data;
    struct link *LAST;
    struct link *NEXT;
};//结构体类型
//last为上一个的地址,next为下一个的地址,p是指定节点的地址
//三者关系为:last->NEXT=p,p->NEXT=next,p->LAST=last,next->LAST=p;
last->NEXT=next;
next->LAST=last;
free(p);//释放内存

相关题目:单链表的删除操作的实现(SWUST OJ-953)

单链表的插入操作的实现(SWUST OJ-952)

环形链表

首尾相接的单向或双向链表

//单向
tail->next=head;
//双向
tail->next=head;
head->last=tail;

相关题目:[猴子报数(SWUST OJ-142)https://www.cnblogs.com/saolv/p/7793379.html)

结束语

学习编程是一个不可中断的过程,从中你能领会到很多东西。
本专题更新结束,喜欢的就点个赞再走吧,或者也可以分享给朋友哦~

猜你喜欢

转载自blog.csdn.net/qq_44322945/article/details/89788479