一、线性表的定义 线性表是具有相同数据类型的n个数据元素的有限序列(n大于等于0),通常记为(a
1,a
2,.......a
i-1,a
i,a
i+1,......a
n) 其中n为表长,当n为0时称为空表。将a
i-1称为a
i的直接前驱,a
i+1称为a
i的直接后继。
二、线性表的基本运算1,线性表的初始化(构造一个空的线性表)
2,求表长
3,取第i个数据元素
4,查找具有特定值的结点,确定其序号
5,插入操作(在原表的第i个位置上插入新元素)
6,删除操作(删除原表中第i个元素)
三、线性表的顺序存储以及运算实现1,顺序表的表示方法
用一组地址连续的存储单元依次存放线性表的元素。
2,顺序表的特定
逻辑上相邻的元素在物理存储上亦相邻;
任一元素的存取时间相同,是一种随机存取结构。
3,顺序表的基本运算
a)顺序表的初始化

Code
1
void initlist_sq( sqlist *L )
2
{
3
*L.length = 0;
4
/**//*或L->length = 0*/
5
}
6
b) 顺序表的插入操作

Code
1
#define ERROR 0
2
#define OK 1
3
int listinsert_sq ( sqlist *L, int i, <datatype> x )
4

{
5
int j;
6
if ( L->length >= maxnum )
7
{
8
printf( “list is full” );
9
return (ERROR);
10
}
11
if ( i<1 || i>L->length+1 )
12
{
13
printf( “ i is invalid value” );
14
return (ERROR);
15
}
16
for ( j=L->length-1; j>=i-1; j-- )
17
L->data[j+1] = L->data[j]; /**//*元素后移*/
18
L->data[i-1] = x; /**//*新元素插入*/
19
L->length++; /**//*表长加1*/
20
return ( OK );
21
}
22
23
c) 顺序表的删除操作

Code
1
int listdelete_sq ( sqlist *L, int i )
2

{
3
int j;
4
if ( i<1 || i>L->length )
5
{
6
printf( “i is invalid value” );
7
return( ERROR );
8
}
9
for ( j=i; j<L->length; j++ )
10
L->data[j-1] = L->data[j]; /**//*元素前移*/
11
L->length--; /**//*长度减1*/
12
return ( OK );
13
}
14
四、线性表的链式存储和运算的实现
1,单链表
结点结构:
链表中每个结点有一个存放数据元素的域,另有一个域存放指向后继结点的指针(表示逻辑关系),故称为单链表。

Code
1
typedef struct node
2

{
3
<datatype> data; /**//*数据域*/
4
struct node * next; /**//*指针域*/
5
}NODE;
6
![]()
![]()
说明: 指针变量head中存放了链表中第一个结点的起始地址,称之为头指针。该指针变量是“静态”定义的,即用NODE * head;定义了指针变量head。链表中的 结 点是 “动态”生成的(称之为结点变量),每个结点可以存放一个数据元素和后继结点的起始地址。最后一个结点因为没有后继结点,故其指针域中存放NULL(空地址)。 当链表中没有数据元素时称为空表。
2,单链表的建立
在单链表的尾部插入结点建立单链表

Code
1
#include “stdio.h”
2
#include “stdlib.h”
3
typedef struct node
4

{
5
int data;
6
struct node *next;
7
}NODE;
8
NODE *create_linklist1( ) /**//*正向建立带表头结点的单链表*/
9

{
10
NODE *head, *p1, *p2;
11
int i;
12
p2 = head = (NODE *) malloc ( sizeof(NODE) );
13
scanf( “%d”, &i );
14
while( i != 0 )
15
{
16
p1 = (NODE *) malloc ( sizeof(NODE) );
17
p1->data = i;
18
p2->next = p1;
19
p2 = p1;
20
scanf( “%d”, &i );
21
}
22
p2->next = NULL;
23
return ( head );
24
}
25
在单链表的头部插入结点建立单链表

Code
1
NODE *create_linklist2( ) /**//*逆向建立不带表头结点的单链表*/
2

{
3
NODE *head, *p;
4
int i;
5
head = NULL;
6
scanf( “%d”, &i );
7
while( i != 0 )
8
{
9
p = (NODE *) malloc ( sizeof(NODE) );
10
p->data = i;
11
p->next = head;
12
head = p;
13
scanf( “%d”, &i );
14
}
15
return ( head );
16
}
17
void printlist1( NODE *p ) /**//*打印带头结点的单链表*/
18

{
19
NODE * p1;
20
p1 = p->next;
21
while( p1 != NULL )
22
{
23
printf( “%d”, p1->data ); p1= p1->next;
24
}
25
printf( “\n” );
26
}
27
3,单链表的插入操作

Code
1
int ListInsert( NODE *L, int i, <datatype> x )
2

{
3
int j;
4
NODE *p, *q, *s;
5
p = L;
6
q = L->next;
7
j = 1;
8
while( q!=NULL && j<i ) /**//*寻找第i个结点,p指向第i-1个结点,q指向第i个结点*/
9
{
10
p = q;
11
q = q->next;
12
++j;
13
}
14
if ( q==NULL || j>i ) /**//*找不到插入点*/
15
return (ERROR);
16
s = (NODE*) malloc ( sizeof(NODE) ); /**//*建立新结点*/
17
s->data = x;
18
s->next = q; /**//* 插入新结点*/
19
p->next = s;
20
return ( OK );
21
}
22
4,单链表的删除操作

Code
1
int ListDelete ( NODE *L, int i )
2

{
3
int j;
4
NODE *p, *q;
5
p = L;
6
q = L->next;
7
j = 1;
8
while ( q != NULL && j < i ) /**//*寻找第i个结点*/
9
{
10
p = q;
11
q = q->next;
12
++j;
13
}
14
if ( q==NULL || j>i ) /**//*删除位置不合理*/
15
return ( ERROR );
16
p->next = q->next; /**//*删除q所指向结点*/
17
free ( q );
18
return ( OK );
19
}
20
5,循环链表
6,双向链表
7,静态链表