C:结构体与链表
结构和链表(C语言)
1.结构
声明结构类型
struct coord {
int x;
int y;
};
定义结构类型变量
struct coord {
int x;
int y;
}first,second;
struct coord {
int x;
int y;
};
struct coord first,second;
利用typedef为结构类型定义一个名称
typedef struct coord Coord;
Coord first, second;
在定义结构变量的时候初始化
Coord first={0,0}, second={1,2};
Coord a={.x=1,.y=4};
结构成员运算符 .
Coord first={0,0}, second={1,2};
Coord a={.x=1,.y=4};
first.x = 50;
first.y = 100;
printf("%d,%d",first.x,first.y);
也可以通过简单的赋值语句在相同类型的结构间复制信息
second = first
定义结构类型的指针,通过指针访问结构类型变量的成员,使用->运算符
Coord *p;
p = &first;
p->x=15;
p->y=20;
printf("%d %d",first.x,first.y);
结构数组
Coord point[2]={a,b};
a.x=10;
printf("%d",a.x);
2.链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
单链表的创建与遍历
每个元素本身由两部分组成:
- 本身的信息,称为“数据域”;
- 指向直接后继的指针,称为“指针域”
//单链表的创建与遍历
#include<iostream>
#include<stdlib.h>
struct node{
int data;
struct node *next;
};
typedef struct node Node;
int main(void)
{
Node *head,*p,*q;
p=(Node*)malloc(sizeof(Node));
p->data=20;
head=p;
for(int i=1;i<3;i++)
{
q=(Node*)malloc(sizeof(Node));
q->data=(i+2)*20;
p->next=q;
p=q;
}
p->next=NULL;
printf("头结点地址:%#x",head);
printf("链表结点地址:");
for(Node *p=head;p!=NULL;p=p->next)
{
printf("%#x ",p);
}
printf("链表结点的内容:");
for(Node *p=head;p!=NULL;p=p->next)
{
printf("%d %#x",p->data,p->next);
}
return 0;
}