0·说明:
本文源码参考书籍和网上资料,如果有错误之处还请指出,欢迎大家一起交流。其中一些关键字需要参考Chap1。下面是干货分享:
1.sequenceList.c
#include "sequenceList.h"
Status InitList_Sq(SqList *L)
{
(*L).elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!(*L).elem)
exit(OVERFLOW); //内存分配失败
(*L).length = 0; //初始化顺序表长度为0;
(*L).listsize = LIST_INIT_SIZE;
return OK;
}
void ClearList_Sq(SqList *L)
{
(*L).length = 0;
}
void DestroyList_Sq(SqList *L)
{
free((*L).elem);
(*L).elem = NULL;
(*L).length = 0;
(*L).listsize = 0;
}
//判断单链表是否为空表
Status ListEmpty_Sq(SqList L)
{
return L.length==0 ? TRUE:FALSE;
}
int ListLength_Sq(SqList L)
{
return L.length;
}
Status GetElem_Sq(SqList L,int i,ElemType *e)
{
if(i<1 || i>L.length)
return ERROR;
else
*e = L.elem[i-1];
return OK;
}
int LocateElem_Sq(SqList L,ElemType e,Status(Compare)(ElemType,ElemType))
{
int i=1;
while(i<=L.length && !Compare(e,L.elem[i-1]))
++i;
if(i<=L.length)
return i;
else
return ERROR;
}
Status NextElem_Sq(SqList L,ElemType cur_e,ElemType *next_e)
{
int i=0;
for(i=0;i<L.length;i++)
if(L.elem[i] == cur_e)
break;
if(i==L.length)
return ERROR;
else
*next_e = L.elem[i+1];
return OK;
}
Status PriorElem_Sq(SqList L,ElemType cru_e,ElemType *pre_e)
{
int i=0;
while(i<L.length && L.elem[i] != cru_e)
i++;
if(i<L.length)
{
*pre_e = L.elem[i-1];
return OK;
}
return ERROR;
}
//向单链表L的第i位插入数据e
Status ListInsert_Sq(SqList *L,int i,ElemType e)
{
ElemType *newbase;
ElemType *p,*q;
if(i<1 || i>(*L).length+1) //i值不合法
return ERROR;
if((*L).length >= (*L).listsize) //若存储空间已满,需要开辟新空间
{
newbase = (ElemType*)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);
(*L).elem = newbase;
(*L).listsize += LISTINCREMENT;
}
q = &(*L).elem[i-1]; //q为插入位置
for(p=&(*L).elem[(*L).length-1];p>=q;--p)
*(p+1) = *p;
*q = e;
(*L).length ++;
return OK;
}
//对元素进行函数调用
Status ListTraverse_Sq(SqList L,void(Visit)(ElemType))
{
int i;
for(i=0;i<L.length;i++)
Visit(L.elem[i]);
return OK;
}
//删除L中第i个元素,并且返回被删除的值
Status ListDelete_Sq(SqList *L,int i,ElemType *e)
{
if(i<1 || i>(*L).length)
return ERROR;
*e = (*L).elem[i-1];
for(i=i-1;i<(*L).length-1;i++)
(*L).elem[i] = (*L).elem[i+1];
(*L).length --;
return OK;
}
/*
//第1种尝试,不可行:
ElemType *p;
for(i=i-1;i<(*L).length-1;i++)
{
*p = (*L).elem[i+1];
(*L).elem[i] = *p;
}
改正,需要对P指针进行初始化
//第2种尝试,可行
for(i=i-1;i<(*L).length-1;i++)
(*L).elem[i] = (*L).elem[i+1];
//第3种尝试,可行
ElemType temp;
for(i=i-1;i<(*L).length-1;i++)
{
temp = (*L).elem[i+1];
(*L).elem[i] = temp;
}
*/
2.sequenceList.h
#ifndef _SEQUENCELIST_H
#define _SEQUENCELIST_H
#include <stdio.h>
#include <stdlib.h>
#include "Status.h"
typedef int ElemType;
#define LIST_INIT_SIZE 100 //顺序表存储空间的初始分配量
#define LISTINCREMENT 10 //顺序表存储空间的分配增量
typedef struct
{
ElemType *elem; //存储空间基地址;
int length; //当前顺序表长度;
int listsize; //当前分配的存储空间容量;
}SqList;
Status InitList_Sq(SqList *L);
void ClearList_Sq(SqList *L);
void DestroyList_Sq(SqList *L);
Status ListEmpty_Sq(SqList L);
int ListLength_Sq(SqList L);
Status GetElem_Sq(SqList L,int i,ElemType *e);
int LocateElem_Sq(SqList L,ElemType e,Status(Compare)(ElemType,ElemType));
Status ListTraverse_Sq(SqList L,void(Visit)(ElemType));
Status ListDelete_Sq(SqList *L,int i,ElemType *e);
Status ListInsert_Sq(SqList *L,int i,ElemType e);
Status NextElem_Sq(SqList L,ElemType cur_e,ElemType *next_e);
Status PriorElem_Sq(SqList L,ElemType cru_e,ElemType *pre_e);
#endif
3.main.c
#include "sequenceList.h"
void printf_Elem(ElemType elem)
{
printf("%d ",elem);
}
void main()
{
SqList La;
int i;
ElemType temp_Elem;
InitList_Sq(&La);
ListEmpty_Sq(La) ? printf("La 为空!\r\n") : printf("La 不为空!\r\n");
for(i=1;i<=6;i++)
{
printf("在La第%d个位置插入:\"%d\"\r\n",i,2*i);
ListInsert_Sq(&La,i,2*i);
}
ListEmpty_Sq(La) ? printf("La 为空!\r\n") : printf("La 不为空!\r\n");
ListTraverse_Sq(La,printf_Elem);
printf("\r\n");
ListDelete_Sq(&La,3,&temp_Elem);
printf("删除的第%d元素为:%d\r\n",3,temp_Elem);
ListTraverse_Sq(La,printf_Elem);
printf("\r\n");
printf("插入元素9在第3位\r\n");
ListInsert_Sq(&La,3,9);
ListTraverse_Sq(La,printf_Elem);
printf("\r\n");
NextElem_Sq(La,4,&temp_Elem);
printf("4后面的元素为:%d\r\n",temp_Elem);
PriorElem_Sq(La,10,&temp_Elem);
printf("10前面的元素为:%d\r\n",temp_Elem);
while(1);
}