线性表,顺序表,单链表
来源:互联网 发布:年会抽奖软件免费版 编辑:程序博客网 时间:2024/06/07 03:42
线性表的定义
定义n个数据元素的有限序列,记作(a1, a2, …, an)ai 是表中数据元素,n 是表长度
线性表的特点
除第一个元素外,其他每一个元素有一个且仅有一个
直接前驱。
除最后一个元素外其他每一个元素有一个且仅有一个
直接后继。
顺序表的定义和特点
定义 将线性表中的元素相继存放在一个连续的存储空间中。
可利用一维数组描述存储结构
特点 线性表的顺序存储方式
遍历 顺序访问, 可以随机存取
单链表的定义
typedef char ListData;
typedef struct node { //链表结点
ListData data; //结点数据域
struct node * link; //结点链域
} ListNode;
typedef ListNode * LinkList;
LinkList first; //链表头指针
插入
第一种情况:在第一个结点前插入
newnode->link= first ;
first = newnode;
第二种情况:在链表中间插入
newnode->link = p->link;
p->link = newnode;
int Insert (LinkList& first, int x,int i ) {
//在链表第 i 个结点处插入新元素x
ListNode * p = first; int k= 0;
while (p != NULL && k< i -1 )
{ p = p->link; k++;} //找第i-1个结点
if ( p == NULL &&first != NULL ){
printf ( “无效的插入位置!\n” );
return 0;
}
ListNode * newnode = //创建新结点
(ListNode *) malloc ( sizeof (ListNode) );
newnode->data = x;
if ( first == NULL || i ==1 ){ //插在表前
newnode->link = first;
first = newnode;
}
else { //插在表中或末尾
newnode->link = p->link;
p->link = newnode;
}
return 1;
}
删除
第一种情况: 删除表中第一个元素
第二种情况: 删除表中或表尾元素
int Delete (LinkList& first, int i){
//在链表中删除第 i 个结点
ListNode *p, *q;
if ( i == 1 ) //删除表中第 1个结点
{ q = first; first = first->link; }
else {
p = first; int k = 0; //找第i-1个结点
while ( p != NULL && k < i-1 )
{ p = p->link; k++; }
if ( p == NULL || p->link ==NULL ) {
printf ( “无效的删除位置!\n” );
return 0;
}
else { //删除表中或表尾元素
q = p->link; //重新链接
p->link = q->link;
}
}
free ( q ); //删除q
return1;
}
表头结点位于表的最前端,本身不带数据,仅标志表头。
设置表头结点的目的是
统一空表与非空表的操作
简化链表操作的实现。
前插法建立单链表
从一个空表开始,重复读入数据:
生成新结点
将读入数据存放到新结点的数据域中
将该新结点插入到链表的前端
直到读入结束符为止。
LinkList createListF ( void ) {
char ch; ListNode *s;
LinkList head = //建立表头结点
(LinkList) malloc (sizeof (ListNode));
head->link = NULL;
while ( (ch = getchar( ) ) != ‘\n’ ) {
s = (listNode *) malloc (sizeof(ListNode));
s->data = ch; //建立新结点
s->link = head->link; //插入到表前端
head->link = s;
}
returnhead;
}
后插法建立单链表
每次将新结点加在链表的表尾;
设置一个尾指针 r,总是指向表中最后一个结点,新结点插在它的后面;
尾指针 r 初始时置为指向表头结点地址。
LinkList createListR ( void ) {
char ch;
LinkList head = //建立表头结点
(LinkList) malloc (sizeof (ListNode));
ListNode *s, *r = head; // r指向表尾
while ( (ch = getchar( ) ) != ‘\n’ ) {
s = (listNode *) malloc (sizeof(ListNode));
s->data = ch; //建立新结点
r ->link = s; r = s; //插入到表末端
}
r->link = NULL; //表收尾
return head;}
单链表清空
void makeEmpty ( LinkList first ) {
//删去链表中除表头结点外的所有其他结点
ListNode *q;
while ( first->link != NULL ) {
q = first->link; first->link= q->link;
//将表头结点后第一个结点从链中摘下
free( q ); //释放它
}
}
计算单链表长度
int Length (LinkList first ) {
ListNode *p = first->link;
//检测指针p 指示第一个结点
int count = 0;
while( p != NULL ) { //逐个结点检测
p = p->link; count++;
}
returncount;
}
在单链表中按值查找
ListNode* Find ( LinkList first,ListDatavalue) {
//在链表中从头搜索其数据值为value的结点
ListNode * p = first->link;
//检测指针 p 指示第一个结点
while ( p != NULL && p->data!= value )
p = p->link;
returnp;
}
在单链表中插入新结点
int Insert (LinkList first, ListData x, inti ) {
//将新元素 x 插入在链表中第 i 号结点位置
ListNode * p = Locate ( first, i-1 );
if ( p == NULL ) return 0; //不插入
ListNode * newnode = //创建新结点
(ListNode *) malloc (sizeof (ListNode) );
newnode->data = x;
newnode->link = p->link; //链入
p->link= newnode;
return 1; //插入成功,函数返回1
}
在单链表中删除一个结点
int delete ( LinkList first, int i ) {
//将链表第 i 号元素删去
ListNode * p = Locate ( first, i-1 );
//寻找被删结点的前驱结点
if ( p == NULL || p->link == NULL)
return 0; //不删除
ListNode * q = p->link; //被删结点地址
p->link= q->link; //摘下被删结点
free ( q ); //释放
return l;
}
int delete ( LinkList first, int i ) {
//将链表第 i 号元素删去
ListNode * p = Locate ( first, i-1 );
//寻找被删结点的前驱结点
if ( p == NULL || p->link == NULL)
return 0; //不删除
ListNode * q = p->link; //被删结点地址
p->link= q->link; //摘下被删结点
free ( q ); //释放
return l;
}
- 线性表,顺序表,单链表
- 线性表-顺序表
- 线性表--- 顺序表
- 线性表顺序表
- 线性表->顺序表
- 线性表- 顺序表
- 线性表--顺序表
- 线性表---顺序表
- 线性表--顺序表
- 线性表---顺序表
- 【线性表】顺序表
- 线性表--顺序表
- 线性表(顺序表)
- 线性表---顺序表
- 线性表--顺序表
- 线性表-顺序表
- 线性表-顺序表
- 数据结构--顺序线性表
- Spring MVC使用HttpClient返回json报406错误解决办法
- 在matlab中实践采用A*算法仿真AGV路径规划-初步
- 摄像机标定和立体标定
- 1079. Total Sales of Supply Chain (25)PAT甲级
- iOS网络层设计感想
- 线性表,顺序表,单链表
- codeblocks常用配置
- Ubuntu 通过PPA安装第三方提供的软件
- 关于我
- 最流行的10种Android恶意软件类别解释
- NGUI:关于ScrollView的ResetPosition 不能用于UIWrapContent
- 汇编4--[BX]和loop指令
- Halcon学习 多层神经网络
- 蓝桥杯之蚂蚁感冒