6-1 单链表逆转
题目要求:
本题要求实现一个函数,将给定的单链表逆转。
代码如下:
List Reverse(List head){
List *p,*pre;
p=NULL;
while(head!=NULL){
pre=head->Next;
head->Next=p;
p=head;
head=pre;
}
return p;
}
本题思路:
1、本题使用三个指针就地逆置单链表,三个指针开火车一样从左到右行驶,pre指向head的下一项,用head指向p来将单链表逆置,直到head走到NULL,即原单链表表尾。
2、PTA平台对指针的声明好像并不严格,p和pre可以直接声明,或者用*p,pre都行。
6-2 顺序表操作集
题目要求:
本题要求实现顺序表的操作集
List MakeEmpty():创建并返回一个空的线性表;
Position Find( List L, ElementType X ):返回线性表中X的位置。若找不到则返回ERROR;
bool Insert( List L, ElementType X, Position P ):将X插入在位置P并返回true。若空间已满,则打印“FULL”并返回false;如果参数P指向非法位置,则打印“ILLEGAL POSITION”并返回false;
bool Delete( List L, Position P ):将位置P的元素删除并返回true。若参数P指向非法位置,则打印“POSITION P EMPTY”(其中P是参数值)并返回false。
代码如下:
List MakeEmpty(){
List L;
L=(List)malloc(sizeof(struct LNode));
L->Last=-1; //不太理解为什么last置0;
return L;
}
Position Find( List L, ElementType X ){
int i;
for(i=0;i<=L->Last;i++){
if(X==L->Data[i]){
return i;
}
}
return ERROR;
}
bool Insert( List L, ElementType X, Position P ){
if(L->Last==MAXSIZE-1){
printf("FULL");
return false;
}
if(P<0||P>L->Last+1){
printf("ILLEGAL POSITION");
return false;
}
int i;
for(i=L->Last+1;i>P;i--){
L->Data[i]=L->Data[i-1];
}
L->Data[i]=X;
L->Last++;
return true;
}
bool Delete( List L, Position P ){
int i;
if(P<0||P>L->Last){
printf("POSITION %d EMPTY",P);
return false;
}
for(i=P;i<L->Last;i++){
L->Data[i]=L->Data[i+1];
}
L->Last--;
return true;
}
本题思路:
1、太久没看数据结构有些生疏,注意要求:顺序表!
2、其实就是很基本的几个函数,目前置空有些不懂。
3、插入算法:看last在哪里,如果是MAXSIZE-1则说明满了,另一限定条件题目要求的也很明白。之后是插入,要先从末尾一换一,右移出一个位置之后插入,Last在里边与length功能类似。
4、删除操作注意看好输出要求。并且删除操作要在Last的前一项停止,对应所有项要统统左移一个单位,这才有for(i=P;i<L->Last;i++)
。
5、PTA不支持顺序表写成L.Data的形式,只能写成L->data形式。
6、