#define Error( Str ) FatalError( Str )
#define FatalError( Str ) fprintf( stderr, \"%s\\n\struct Node
{ElementType Element; Position Next;};
List MakeEmpty( List L ) //创建空链表 {if( L != NULL ) DeleteList( L );
L = malloc( sizeof( struct Node ) ); if( L == NULL )
FatalError( \"Out of memory!\" ); L->Next = NULL; return L;}
int IsEmpty( List L )//判断链表是否为空 {return L->Next == NULL;} int IsLast( Position P, List L ) {return P->Next == NULL;}
Position Find( ElementType X, List L )//精确查找函数 {Position P;
int n=1; P = L->Next;
while( P != NULL && P->Element != X ) {P = P->Next;n++;} if(P==NULL)
printf(\"查找的成员不存在!!\\n\\n\"); else
printf(\"查找的成员位于链表第%d位\\n\\n\void Delete( ElementType X, List L )//精确删除函数 {Position P, TmpCell; P = FindPrevious( X, L ); if( !IsLast( P, L ) ) {TmpCell=P->Next;
P->Next=TmpCell->Next;
free( TmpCell );}}
Position FindPrevious( ElementType X, List L )//前驱查找函数 {Position P; P = L;
while( P->Next != NULL && P->Next->Element != X ) P = P->Next; return P;}
void Insert( ElementType X, List L, Position P )//元素插入函数 {Position TmpCell;
TmpCell = malloc( sizeof( struct Node ) ); if( TmpCell == NULL )
FatalError( \"Out of space\" ); TmpCell->Element = X; TmpCell->Next = P->Next; P->Next = TmpCell;}
void DeleteList( List L )//清空链表函数 {Position P, Tmp; P = L->Next; L->Next = NULL; while( P != NULL ) {Tmp = P->Next; free( P ); P = Tmp;} if(IsEmpty(L))
printf(\"链表清空成功!\\n\\n\");}
Position Header( List L )//表头调用函数 {return L;}
Position First( List L )//首元素调用函数 {return L->Next;}
Position Advance( Position P )//元素递进函数
{return P->Next;}
void show(List L)//显示链表函数 {if(!IsEmpty(L)) {Position p; p=First(L);
printf(\"当前链表成员如下:\\n\"); while(p!=NULL)
{printf(\"%d \
if(Advance(p)) p=Advance(p); else
{printf(\"\\n\\n\");break;}}}
else
printf(\"当前链表为空!!\\n\\n\"); } void join(List L) //插入函数调用函数 {int x,n,i;
Position p=Header(L);
printf(\"请输入需要插入的成员:\\n\"); scanf(\"%d\
printf(\"需要将成员插入到第几位呢?\\n\"); scanf(\"%d\ for(i=1;iNext;} Insert(x,L,p); show(L);}void find(List L)//查找函数调用函数 {printf(\"请输入需要查找的成员:\\n\"); int x;
scanf(\"%d\ Find(x,L);}
void count(List L)//链表长度统计函数 {Position p; p=First(L); int n=0; while(p!=NULL) {n++;
if(Advance(p)) p=Advance(p); else break;}
printf(\"当前链表长度为:%d\\n\\n\void direction(List L)//位置访问函数 {int n,i;
Position p=Header(L);
printf(\"请输入n的值:\\n\"); scanf(\"%d\ for(i=0;iNext;}printf(\"第%d位成员为:%d\\n\\n\void change(List L)//修改元素函数 {printf(\"请输入n的值:\\n\"); int x,n,i; scanf(\"%d\
printf(\"请输入修改后的值:\\n\"); scanf(\"%d\ Position p=Header(L); for(i=0;iNext;} p->Element=x; show(L);}void deletion(List L)//删除函数调用函数 {printf(\"你要删除的成员是:\\n\"); int x;
scanf(\"%d\ Delete(x,L); show(L);} void main() { List L;
L=MakeEmpty(NULL);
printf(\"请输入需要插入的成员个数:\\n\"); int n;
scanf(\"%d\
printf(\"请输入需要插入的成员以空格隔开:\\n\"); int i;
Position p; p=Header(L); for(i=0;iscanf(\"%d\Insert(x,L,p); p=Advance(p);}show(L);
printf(\"请选择需要进行的操作:\\n 1.计算链表长度\\n 2.取第n个位置成员\\n 3.修改第n个位置成员\\n 4.在第n位插入新成员\\n 5.删除成员\\n 6.搜索成员\\n 7.销毁链表\\n 8.退出\\n你输入的选项是:\"); scanf(\"%d\
while(n!=8) {switch(n)
{case 1:count(L);break;
case 2:direction(L);break; case 3:change(L);break; case 4:join(L);break; case 5:deletion(L);break; case 6:find(L);break; case 7:DeleteList(L);break;}
printf(\"请选择需要进行的操作:\\n 1.计算链表长度\\n 2.取第n个位置成员\\n 3.修改第n个位置成员\\n 4.在第n位插
入新成员\\n 5.删除成员\\n 6.搜索成员\\n 7.销毁链表\\n 8.退出\\n你输入的选项是:\"); scanf(\"%d\
四.运行结果: 1.顺序表:
3. 单链表:
五.实验心得:
通过这次写实验报告,我深切的理解了这门课的本质。刚开始学这门课时,当时还不清楚这门课程的目的,现在,我真正的理解了:数据结构像是身体的骨骼,而C是填充这骨骼的肉体,二者相结合才能使整个程序更加完整,健全。数据结构是个框架,模型,抽象数据类型中列举了各种操作,而所用的C语言,将各种操作描述出来构成算法。数据结构+算法=程序设计。 这次的实验报告,让我受益匪浅,不仅有知识方面的,还有生活和精神上的。总之,我会继续我的兴趣编程,相信在编程的过程中,能不断的提高自己。