PtrL->Data[i-1] = X; /*新元素插入*/
PtrL->Last++; /*Last仍指向最后元素*/ return; }
7、删除算法
void Delete( int i, List *PtrL ) { int j;
if( i < 1 || i > PtrL->Last+1 ) { /*检查空表及删除位置的合法性*/
printf (“不存在第%d个元素”, i ); return ; }
for ( j = i; j <= PtrL->Last; j++ )
PtrL->Data[j-1] = PtrL->Data[j]; /*将 ai+1~ an顺序向前移动*/
PtrL->Last--; /*Last仍指向最后元素*/ return; } 8、求表长
int Length ( List *PtrL )
{ List *p = PtrL; /* p指向表的第一个结点*/ int j = 0;
while ( p ) { p = p->Next;
j++; /* 当前p指向的是第 j 个结点*/
} return j; } 9、查找
(1)按序号查找: FindKth; List *FindKth( int K, List *PtrL ) { List *p = PtrL; int i = 1;
while (p !=NULL && i < K ) { p = p->Next; i++; }
if ( i == K ) return p; /* 找到第K个,返回指针 */ else return NULL; /* 否则返回空 */ }
(2)按值查找: Find
List *Find( ElementType X, List *PtrL ) {
List *p = PtrL;
while ( p!=NULL && p->Data != X ) p = p->Next; return p; }
10、插入(在链表的第 i-1(1≤i≤n+1)个结点后插入一个值为X的新结点)
List *Insert( ElementType X, int i, List *PtrL ) { List *p, *s;
if ( i == 1 ) { /* 新结点插入在表头 */
s = (List *)malloc(sizeof(List)); /*申请、填装结点*/ s->Data = X; s->Next = PtrL;
return s; /*返回新表头指针*/ }
p = FindKth( i-1, PtrL ); /* 查找第i-1个结点 */ if ( p == NULL ) { /* 第i-1个不存在,不能插入 */
printf("参数i错"); return NULL;
}else {
s = (List *)malloc(sizeof(List)); /*申请、填装结点*/
s->Data = X;
s->Next = p->Next; /*新结点插入在第i-1个结点的后面*/
p->Next = s; return PtrL; } }
11、删除(删除链表的第 i (1≤i≤n)个位置上的结点)
List *Delete( int i, List *PtrL ) { List *p, *s;
if ( i == 1 ) { /* 若要删除的是表的第一个结点 */
s = PtrL; /*s指向第1个结点*/
PtrL = PtrL->Next; /*从链表中删除*/ free(s); /*释放被删除结点 */
return PtrL; }
p = FindKth( i-1, PtrL ); /*查找第i-1个结点*/ if ( p == NULL ) {
printf(“第%d个结点不存在”, i-1); return NULL;
} else if ( p->Next == NULL ){
printf(“第%d个结点不存在”, i); return NULL;
} else {
s = p->Next; /*s指向第i个结点*/ p->Next = s->Next; /*从链表中删除*/ free(s); /*释放被删除结点 */
return PtrL; } }
12、链表不具备的特点是 1 。
①可随机访问任一节点 ②插入删除不须要移动元素 ③不必事先估计存储空间 ④所需空间与其长度成正比 13、带头结点的单链表head为空的判定条件是 2 。
①head==NULL ②head->next==NULL ③head->next==head ④head!=NULL
14、如果最常用的操作是取第i个结点及其前驱,则采用 4 存