一、线性表的定义 线性表是具有相同数据类型的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
3int 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
1int 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
1typedef 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”
3typedef struct node
4{
5 int data;
6 struct node *next;
7}NODE;
8NODE *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
1NODE *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}
17void 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
1int 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
1int 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,静态链表