数据结构线性表(上)

本文介绍了链表的基本概念,包括利用数组结构串联的有序列表及其缺点,以及采用动态内存配置的链表的工作原理。动态内存配置的链表在插入或删除元素时更为灵活。此外,还讲解了结构体指针、结构体数组指针的用法,以及`++p`和`p++`在访问结构体成员时的区别。

链表

链表是一种有序的列表,链表的内容通常是存贮于内存中分散的位置上。而链表串联的方式有两种:

(1)利用数组结构串联的有序列表。如:利用两个数组,一个存放数据,另一个存放连接的关系,假设是从数组中的Data[4]元素开始则数据的链接关系如下图:

 

                                        0      1       2         3             4         5       6      7        8               9

 is datathis a array!!

       (上下一一对应):

  8     1     3 9         

 

不过这种链表最大的缺点在于放入或删除元素,常常要大量的移动其他元素,而且数组的大小是固定的,缺乏使用弹性。

(2):第二种是以动态内存配置的链表。一个动态内存的配置链表,是由许多的节点所链接而成的,每个节点包含了数据部分和指向链表中下一节点的指针。以动态内存配置的链表,在插入或删除元素时,只需要将指针改变指向即可。

 

结构体类型定义:
struct s{                  //struct是结构体类型的关键字,s为结构体名
  char name[10];
  int age;
  char sex;
}; 
结构体变量的定义方式有3种:
(1)先定义结构体,后定义结构体变量。
struct s{
 char name[10];
 int age;
 char sex;
}
struct s s1,s2;
(2)
struct s{
  char name[10];
  int age;
  char sex;
}s1,s2;
(3)只定义结构体变量:
struct {
  char name[10];
  int age;
  char sex;
}s1,s2;

结构体嵌套:
struct time{
 int hour;
 int minute;
 int second;
}t;
struct data{
 int day;
 int month;
 int year;
 struct time t;
}d;

结构体类型引用:----->结构体变量名.成员名

结构指针:

结构体指针可以指向结构体变量的首地址,其定义形式如下: struct  结构体类型*指针名

struct   st{

  char name[10];

  int age;

  char sex;

  float score;

}s;

struct   st*p;

定义了一个结构体st的指针p,但其值是不确定的。通过下语句可以将结构体变量s的地址赋给p,使p指向结构体变量s。

p=&s;  (其中&为去地址符号,&s表示结构体变量s的地址)

指针赋值后,通过指针即可访问结构体中的成员,如:(*p).name   (*p).sex

另一种方式来访问结构体成员,即运用运算符“——>”如下所示:p——>name  ,p——>sex.

结构体数组指针:

#include<stdio.h>
struct st{
 char name[10];
 int age;
 char sex;
}s[3];
void main(){
 struct st s[3]={{"zhangsan",20,'M'},{"lisi",21,'W'},{"wangjia",22,'W'}};
 struct st *p;
 p=s;
 for{int i=0;i<3;i++}{
    printf("%s,%d,%c",p->name,p->age,p->sex);
    p++;
 }
}

(++p)->num和(p++)->num的区别:

(1)(++p)->num:先使p的值加一,使p指向数组的下一个元素再访问该结构体成员num。

(2)(p++)->num:先访问元素的结构体成员num,再使p的值加一,指向下一个元素。

结构体数组指针p指向数组有以下三种形式:

(1)p=s   (2)p=&s   (3)p=&s[0]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值