C语言学习笔记-9.结构体
一、结构体的定义与使用
1.结构体内部的每个变量称为字段或成员变量
2.定义方法:struct <结构体标记> {…};
或 typedef struct {…} <结构体类型名>;
变量定义:struct <结构体标记> 变量1,2…
或 <结构体类型名> 变量1,2…
3.成员变量的访问: x.成员变量名 (*px).成员变量名 px->成员变量名
“->”称为指向运算符或箭头运算符
4.不能直接比较(==、!=)两个结构体变量
二、链表
1.链表中的每个元素称为结点,每个结点包含两部分内容,一是用户需要使用的实际数据,二是下一个结点的起始地址
另外还有一个头指针,用来指向链表的首结点
例:
struct tag
{
char name[12]; //结点描述信息
struct tag *next; //指向下一结点的指针
}2.创建静态链表
例:
struct tag *Create (struct tag a[], int n)
{
struct tag *head = &a[0];
int i;
for (i = 0; i < n; ++i)
{
if(i < n - 1)
a[i].next = &a[a + 1];
else
a[i].next = NULL;
}
return head;
}
int main()
{
struct tag array[10], *head;
head = Create(array, 10);
return 0;
}注意:静态链表各结点在内存中连续存放,故可不用next指针,但这只是一个特例
3.创建动态链表
例:
struct tag *Create ()
{
struct tag *head, *p, *q;
head = p = q = NULL;
while(1)
{
//输入结点信息
if(...)
break; //判断结束输入跳出
p = (struct tag *)malloc(sizeof(struct tag));
p->var = var //结点信息存储
if(head == NULL)
head = p;
else
q->next = p;
}
if(head != NULL)
q->next = p;
return head;
}4.访问链表
void display(struct tag *head)
{
struct tag *p;
p = head;
while(p != NULL)
{
//输出
p = p->next;
}
}5.删除链表结点
首结点:p = head; head = p->next; free(p);
中间结点:令p指向待删除结点,q指向上一结点
q->next = p->next; free(p);
6.插入链表结点
链表为空:head = pNode;
插入至首位:pNode –> next = head; head = pNode;
插入至p, q之间:pNode –>next = p; q->next = pNode;
7.链表的释放
例:
void destroy(struct tag *head)
{
struct tag *p, *q;
p = head;
while(p != NULL)
{
q = p;
p = p->next;
free(q);
}
}