1.数据的储存的方法有:数组和链表;
链表对于数组的优化有:<1.>不用开始时就精确的制定所需内存单元的大小;
<2>.对数组中的元素进行增、删、改时特别不方便;
但链表也有它的不足:由于它不是在内存单元上连续存储的,所以链表中的数据查询起来没 有数组那么简单。
链表(单链表): 0024 0004 0008 NULL(指针域)
结点: 丙 · 乙 甲 丁 (数据域)
存储位置: 0004 0008 0016 0024
* 指针域和数据域是结点所要存储的数据,数据按甲、乙、丙、丁的顺序排列,存储甲的结点需要保存甲自身的数据域和乙的指针域,乙、丙也相同,而丁作为最后一个元素,保存的指针域便是一个空指针;
* 链表中各元素类型一致。
2.链表分类:
单链表:指针域只有一个的链表;(数据域+后继元素地址)
双链表:指针域有两个的链表;(前一元素地址+数据域+后继元素地址)
循环链表:最后一个元素的指针域非空且为首元素地址。
3.链表组成:
头指针(唯一确定单链表)+头结点(可有可无)+首元结点......+尾结点
4.单链表存储数据:
存储学生信息
1.不常用
typedef struct student
{
char num; //存储学号
char name; //存储姓名
int score; //´存储成绩
struct Linklist * next; //建立指针域
}Lnode,Linklist;2.常用
typedef struct
{
char num; //存储学号
char name; //存储姓名
int score; //´存储成绩
}Elemtype;typedef struct Node
{
Elemtype data;
struct Linklist * next; //建立指针域
}Node,Linklist;
5.单链表的构建
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;//储存结点数据
struct node*next;//储存下一结点地址
};//注意结构体创建有分号
int main(void)
{
struct node * head,* p,* q,* t;
int i,n,a;
scanf("%d",&n);//数据元素个数
head = NULL;//头指针初始为空
for(i=0;i<n;i++)
{
scanf("%d",&a);//输入n个数据
p=(struct node *)malloc(struct node);//动态申请一个空间用来存放结点
p->data = a;
p->next = NULL;
if(head==NULL)//头结点
head=p;
else//非头结点
q->next = p;
q = p;
}
t = head;
while(head!=NULL)
printf("%d',t->data);
t=t->next;
}
6.链表的插入
原理:首先由头指针开始遍历个结点,找到合适的位置后插入
scanf("%d",&a);//要插入的数
t = head;//由原链表头指针开始遍历
while(t!=NULL)//循环条件
{
if(t->next->data>a)
{
p=(struct node*)malloc(sizeof(struct node));
p->data=a;
p->next=t->next;
t=p->next;
break;
}
t=t->next;
}
7.链表中第m个数据的查找
int m,j=0;
scanf("%d",&m);
t = head;
while(t!=NULL)
{
++j;//计数器
if(j==m)
{
printf("%d",t->data);
}
t=t->next;
}
}