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)
环形链表
首尾相接的单向或双向链表
//单向
tail->next=head;
//双向
tail->next=head;
head->last=tail;
相关题目:[猴子报数(SWUST OJ-142)https://www.cnblogs.com/saolv/p/7793379.html)
结束语
学习编程是一个不可中断的过程,从中你能领会到很多东西。
本专题更新结束,喜欢的就点个赞再走吧,或者也可以分享给朋友哦~