学习完线性表的知识已经很长时间了,今天有空重新复习整理一下。线性表有两种表示方法,顺序表示和链式表示。
顺序表示即就是数组,其特点为:
优:(1)用数组存储数据元素,操作方法简单,容易实现
(2)无须为表示结点间的逻辑关系而增加额外的存储开销
(3)存储密度高
(4)顺序表可按元素位序随机存取结点
缺:(1)做插入、删除操作时,需大量移动数据元素,效率非常低
(2)要占用连续的存储空间,存储分配只能预先进行。分配过大,会导致空间浪费;分配过小将会造成数据溢出。
链式表示即就是链表,其特点为与顺序表相反
链表不用事先估计存储空间的大小,但其存储密度较低(存储密度:指一个结点中数据元素所占的存储单元数和整个结点所占的存储单元之比,顺序表的存储密度为1,链式存储密度小于1)
链表的插入有两种方式:头插法和尾插法
头插法:在头结点(为了操作方便,在单链表的第一个结点之前附加一个结点,称为头结点。头结点的数据域可以存储数据标题、表长等信息,也可以不存储任何信息,其指针域存储第一个结点的首地址)H之后插入数据,其特点是读入的数据顺序与线性表的逻辑顺序正好相反
#include <stdio.h>
#include <stdlib.h>
#define N 10
struct Data{
int num;
struct Data *next;
};
int main ( int argc , char * argv[])
{
int data,i;
struct Data *head,*p;
head = (struct Data *)malloc (sizeof(struct Data));
head->next = NULL;
for ( i = 0; i < N; i++)
{
scanf ("%d",&data);
p = ( struct Data *)malloc(sizeof(struct Data));
p->num = data;
p->next = head->next;
head->next = p;
}
printf("the list is :");
while (p!=NULL)
{
printf("%d\t",p->num);
p=p->next;
}
printf("\n");
return 0;
}
尾插法:将每次插入的新结点放在链表的尾部
#include <stdio.h>
#include <stdlib.h>
#define N 10
struct Data{
int num;
struct Data *next;
};
struct Data * Insert()
{
int data,i;
struct Data *head,*r,*s;
head = ( struct Data * )malloc( sizeof (struct Data));
head->next = NULL;
r=head;
for (i=0; i<N; i++ )
{
scanf("%d",&data);
s = ( struct Data *)malloc(sizeof (struct Data));
s->num = data;
s->next = r->next;
r->next = s;
r=s;
}
/*
printf("the list is :");
s=head->next;
while(s!=NULL);
{
printf("%d\t",s->num);
s = s->next;
}
printf("\n");*/
return head;
}
int main ( int argc , char * argv [])
{
struct Data *head,*p;
head = Insert();
printf("the list is : ");
p = head->next;
while(p!=NULL)
{
printf("%d\t",p->num);
p = p->next;
}
printf("\n");
}