线性结构
typedef struct node
ElemType data;
{
struct node * next;
}SLink;
一 类型定义
1 顺序表
# define MAXSIZE 100
typedef struct
{
ElemType data [MAXSIZE];
int length;
}SqList;
2 单链表
3 双链表
typedef struct node
ElemType data;
{
struct node *prior,*next;
}dlink;
二 基础要点
1 单链表
2 双链表
三 算法
1 删除顺序表中重复元素
void delsame( int A[], int count )
0
{
int i, j, k;
if( N > 1 )
j = 1;
{
for( i =1; i < N; i++ )
{
k = 0;
while( k < j && A[k] != A[i] )
if( k >= j )
k++;
A[j++] == A[i];
}
A[j] == ‘\0’
}
}
2 给无序表建有序索引表
typedef struct indexelem
{
KeyType key;
int
sn;
//关键字
//序号
//索引项
}IndexType;
IndexType idx[1...m];
DataType data[1...m]; //原顺序表
for( i = 1; i <=m; i++ )
{
//索引表
j = i - 1;
while( j > 0 && idx[j].key > data[i].key )
{
idx[j+1] = idx[j];
j--;
//把大于 data[i].key 的所有 idx[j].key 后移
}
idx[j+1].key = data[i].key;
idx[j+1].sn = i;
//插入 data[i].key 至 idx 中,并记下其序号 i
}
3 逆置单链表
void reverse( LinkList H )
{
SNode *p, *temp;
P = H->next;
H->next = NULL;
while( p )
{
temp = p;
p = p->next;
temp->next = H->next;
H->next = temp;
}
}
void reverse( LinkList H )
SNode *p, *q, *temp;
{
P = H->next;
q = NULL;
while( p )
{
temp = p;
p = p->next;
temp->next = q;
q = temp;
1
}
H->next = q;
}
4 拆分单链表
decompese( SNode *L,SNode *ha,SNode *hb,SNode *hc )
{
if( (p->data >= ‘A’ && p->data <= ‘Z’)||(p->data >= ‘a’ && p->data <= ‘z’) )
{
SNode *temp,*p;
p = L;
ha = (SNode*)malloc(sizeof(SNode));
hb = (SNode*)malloc(sizeof(SNode));
hc = (SNode*)malloc(sizeof(SNode));
ha->next = ha;
hb->next = hb;
hc->next = hc;
while( p )
{
temp = p;
p = p->next;
temp->next = ha->next;
ha->next = temp;
}
else if(p->data >= ‘0’ && p->data <= ‘9’ )
{
temp = p;
p = p->next;
temp->next = hb->next;
hb->next = temp;
}
else
{
}
}
temp = p;
p = p->next;
temp->next = hc->next;
hc->next = temp;
}
5 删除单链表重复元素
void delete(LinkList H)
SNode *p,*q,*r;
{
P = H->next;
while( p != NULL )
{
q=p;
while ( q->next )
{
if ( q->next->data == p->data )
{
r = q->next;
q->next = r->next;
free(r);
}
else
q = q->next;
2
}
p = p->next;
}
}
6 合并单链表
LinkList merge(LinkList A,LinkList B)
{
LinkList C;
SNode *p,*q;
P = A->next;
q = B->next;
C = A;
C->next = NULL;
free(B);
while ( p && q )
{
if (p->datadata)
{
s = p;
p = p->next;
}
else
{
}
s = q;
q = q->next;
s->next = C->next;
C->next = s;
}
if ( p == NULL )
if ( q==NULL)
while (r )
r = q;
r=p;
s =r;
r = r->next;
s->next = C->next;
C->next = s;
{
}
/*插入到 C 表的头部*/
/* 将剩余的结点一个个摘下,插入到 C 表的头部*/
}
7 顺序表和链表的递归输出
已知 head 是带头结点的单链表的头指针,试编写逆序/顺序输出表中各元素的递归算法;
有一个整数数组 A[n],按顺序/逆序递归输出数组中的各元素
output( LinkList *head )
if( head != NULL )
{
{
output( head->next );
printf( “%d”,head->data );
//printf 在 output 下为逆序输出,在上为顺序输出
}
}
8 带访问频度的双向链表的查找
3
8 置逆栈
void reverse( Stack *s )
{
Stack s1, s2;
ElemType x;
InitStack( s1 );
InitStack( s2 );
while( StackEmpty( s ) != 0 )
{
Pop( s, x );
Push( s1, x );
}
while( StackEmpty( s1 ) != 0 )
{
Pop( s1, x );
Push( s2, x );
}
while( StackEmpty( s2 ) != 0 )
{
Pop( s2, x );
Push( s, x );
}
//将 s 栈中的内容转移到 s1 栈中
//将 s1 栈中的内容转移到 s2 栈中
//将 s2 栈中的内容转移到 s 栈中
}
9 用栈实现队列操作
int EnQueue( Stack *s1, Stack *s2, ElemType x )
{
if( s1->top == MaxSize )
//队列上溢
return -1;
Push( s1, x );
return 0;
else
{
}
}
4
int DeQueue( Stack *s1, Stack *s2, ElemType *x )
{
ElemType y;
while( StackEmpty(s1) != 0 )
{
Pop( s1, y );
Push( s2, y );
}
Pop( s2, x );
while( StackEmpty(s2) != 0 )
{
Pop( s2, y );
Push( s1, y );
}
//将 s1 的所有元素退栈进入 s2 中
//将 s2 的栈顶元素退栈并赋给 x
//将 s2 余下的元素退栈后进入 s1 中
}
10 共享存储空间的栈的基本操作
top1 = 1;
top2 = m;
int push( ElemType x, int i )
{
return -1;
if( top1 == top2 - 1 )
else if( i == 1 )
top1++;
{
c[top1] = x;
}
else
{
top2--;
c[top2] = x;
}
return 0;
//上溢出
//对第一个栈进行进栈操作
//对第二个栈进行进栈操作
}
int pop( ElemType *x, int i )
{
if( i == 1 )
{
if( top1 == 0 )
else
{
x = c[top1];
top1--;
//对第一个栈进行出栈操作
return -1;
//栈 1 下溢出
}
}
else
{
if( top2 == m + 1 )
else
{
x = c[top2];
top2++;
}
}
return 0;
}
void setnull( int i )
{
if( i == 1 )
else
}
top1 = 1;
top2 = m;
//对第二个栈进行出栈操作
return -1;
//栈 2 下溢出
5
11 括号匹配检验
#define m 100
Correct(exp,tag)
{
int top=0; i=1; tag=1
while(i<=m&&tag)
{
if(exp[i]==’(‘|| exp[i]==’[‘‘|| exp[i]==’{‘)
st[top++]=exp[i];
if(exp[i]==’)’)
if(st[top]==’(’)
else
tag=0;
if(exp[i]==’]’)
if(st[top]==’(’)
else
tag=0;
if(exp[i]==’}’)
if(st[top]==’(’)
tag=0;
else
top--;
top--;
top--;
i++;
}
If(top>0)
tag=0;
}
四 查找排序算法
1 折半查找
#define MAX 100
typedef struct
{
KeyType key;
ElemType date;
}RecType;
typedef struct
{
RecType r[MAX];
int length;
}sqlist;
int Binary_Search( sqlist R, KeyType k )
{
int mid, low=1, high=r.length;
while( low <= high )
{ mid = ( low + high ) / 2;
if( k < R.r[mid].key )
high = mid - 1;
else if( k > R.r[mid].key )
low = mid + 1;
else
return mid;
}
return -1;
}
6
2 分块查找
3 哈希表的插入
hashinsert( int s[], int m, int key )
{
s[H] = key;
H = hash( key );
if( s[H] == 空 )
else
{
}
s[H1] = key;
H1 = (H+1)%m;
while( s[H1] != 空 )
H1 = (H1+1)%m;
}
4 哈希表的查找
hashsearch( int s[], int m, int key )
{
H = hash( key );
if( s[H] == 空 )
else if( s[H] == key )
else
{
return -1;
return H;
H1 = (H+1)%m;
while( s[H1] != key && s[H1] != 空 && H1 != H )
H1 = (H1+1)%m;
}
7