- 2
- 0
- 约1.01万字
- 约 13页
- 2019-10-21 发布于山西
- 举报
13 -
第二章 线性表
2.1 线性表的概念及运算
线 性 表:线性表是n个数据元素a1,a2,…an的有限序列。n为表的长度,当n=0时称为空表,n=0时记作:
(a1,a2,……an)
例 如:(A,B,……Z)
(2,3,4,……10,J,Q,K,A)
一组学生记录
运 算:(1)置空表
(2)求长度
(3)取结点
(4)定位
(5)插入
(6)删除
2.2 线性表的顺序存储
顺 序 表:把结点按照逻辑次序存放在一组地址连续的存储单元里。是一种随机存储结构。
显 然:LOC(ai)=LOC(a1)+(i-1)*l
自 然:typedef struct
{ datatype data[maxsize];
int last;
}sequenlist;
sequenlist *L;
或 者:定义一个数组+一个整型表长
顺序表上的基本运算:
(1)插入运算
(a1,a2,…,ai,…an)
(a1,a2,…,x,ai,…an)
算 法:for(j=n;j=i;j--)
a[j+1]=a[j];
a[j+1]=x;
算法分析:
E=(n+n-1+…+1)/(n+1)=n(n+1)/2(n+1)=n/2
T(n)=O(n)
(2)删除运算
(a1,a2,…,ai,…an)
(a1,a2,…,ai-1,ai+1,…an)
算 法:for(j=i+1;j=n;j++)
a[j-1]=a[j];
算法分析:
E=(n-1+n-2…+1)/n=n(n-1)/2n=(n-1)/2
T(n)=O(n)
2.3 线性表的链式存储
1.单链表:由若干个数据结点按照逻辑次序用指针连接起来。
head-
a1 | -
a2 | -
a3 |-
……
an | 0
头指针: head(唯一确定一个链表)
尾指针: NULL(常量0,尾结点标志)
结点定义:
data
next
d1
d2
…
dn
next
typedef int datatype;
typedef struct node
{ datatype data;
struct node *next;
}linklist;
linklist *head,*p;
结点生成:p=malloc(sizeof(linklist)); //p=new linklist;
free(p) //delete(p);
结点访问:(*p).data (*p).next
p-data p-next
2. 单链表上的基本运算
建立单链表:
(1)头插法建表
linklist *creatlistf()
{ char ch;
linklist *head,*s;
head=NULL;
ch=getchar();
while(ch!=$)
{ s=malloc(sizeof(linklist));
s-data=ch;
s-next=head;
head=s;
ch=getchar();
}
return head;
}
核心代码:s-next=head; head=s;
算法分析:T(n)=O(n)
(2)尾插法建表
linklist *creatlistr()
{ char ch;
linklist *head,*s,*r;
head=NULL;
r=NULL;
ch=getchar();
while(ch!=$)
{ s=malloc(sizeof(linklist));
s-data=ch;
if (head==NULL) head=s;
else r-next=s;
r=s;
ch=getchar();
}
if (r!=NULL) r-next=NULL;
return head;
}
核心代码:r-next=s; r=s;
算法分析:T(n)=O(n)
(3)尾插法建表(带头结点)
在链表中引入头结点的主要
原创力文档

文档评论(0)