6-1 链表逆置(20 分)函数
本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表结点定义以下:测试
struct ListNode {spa
int data;设计
struct ListNode *next;指针
};code
函数接口定义:blog
struct ListNode *reverse( struct ListNode *head );接口
其中head是用户传入的链表的头指针;函数reverse将链表head逆置,并返回结果链表的头指针。element
裁判测试程序样例:it
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *createlist(); /*裁判实现,细节不表*/
struct ListNode *reverse( struct ListNode *head );
void printlist( struct ListNode *head )
{
struct ListNode *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *head;
head = createlist();
head = reverse(head);
printlist(head);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
1 2 3 4 5 6 -1
输出样例:
6 5 4 3 2 1
struct ListNode *reverse( struct ListNode *head ) { struct ListNode *p,*q=NULL,*r=NULL; if(head==NULL) { return NULL; } if(head->next==NULL) { return head; } p=head; while(p!=NULL) { q=p->next; p->next=r; r=p; p=q; } return r; }
6-2 求链式表的表长(10 分)
本题要求实现一个函数,求链式表的表长。
函数接口定义:
int Length( List L );
其中List结构定义以下:
typedef struct LNode *PtrToLNode;
struct LNode {
ElementType Data;
PtrToLNode Next;
};
typedef PtrToLNode List;
L是给定单链表,函数Length要返回链式表的长度。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct LNode *PtrToLNode;
struct LNode {
ElementType Data;
PtrToLNode Next;
};
typedef PtrToLNode List;
List Read(); /* 细节在此不表 */
int Length( List L );
int main()
{
List L = Read();
printf("%d\n", Length(L));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
1 3 4 5 2 -1
输出样例:
5
int Length( List L ) { if(L==NULL) { return 0; } else { int len=1; while(L->Next!=NULL) { len++; L=L->Next; } return len; } }
6-3 链式表操做集(20 分)
本题要求实现链式表的操做集。
函数接口定义:
Position Find( List L, ElementType X );
List Insert( List L, ElementType X, Position P );
List Delete( List L, Position P );
其中List结构定义以下:
typedef struct LNode *PtrToLNode;
struct LNode {
ElementType Data;
PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;
各个操做函数的定义为:
Position Find( List L, ElementType X ):返回线性表中首次出现X的位置。若找不到则返回ERROR;
List Insert( List L, ElementType X, Position P ):将X插入在位置P指向的结点以前,返回链表的表头。若是参数P指向非法位置,则打印“Wrong Position for Insertion”,返回ERROR;
List Delete( List L, Position P ):将位置P的元素删除并返回链表的表头。若参数P指向非法位置,则打印“Wrong Position for Deletion”并返回ERROR。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#define ERROR NULL
typedef int ElementType;
typedef struct LNode *PtrToLNode;
struct LNode {
ElementType Data;
PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;
Position Find( List L, ElementType X );
List Insert( List L, ElementType X, Position P );
List Delete( List L, Position P );
int main()
{
List L;
ElementType X;
Position P, tmp;
int N;
L = NULL;
scanf("%d", &N);
while ( N-- ) {
scanf("%d", &X);
L = Insert(L, X, L);
if ( L==ERROR ) printf("Wrong Answer\n");
}
scanf("%d", &N);
while ( N-- ) {
scanf("%d", &X);
P = Find(L, X);
if ( P == ERROR )
printf("Finding Error: %d is not in.\n", X);
else {
L = Delete(L, P);
printf("%d is found and deleted.\n", X);
if ( L==ERROR )
printf("Wrong Answer or Empty List.\n");
}
}
L = Insert(L, X, NULL);
if ( L==ERROR ) printf("Wrong Answer\n");
else
printf("%d is inserted as the last element.\n", X);
P = (Position)malloc(sizeof(struct LNode));
tmp = Insert(L, X, P);
if ( tmp!=ERROR ) printf("Wrong Answer\n");
tmp = Delete(L, P);
if ( tmp!=ERROR ) printf("Wrong Answer\n");
for ( P=L; P; P = P->Next ) printf("%d ", P->Data);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
6
12 2 4 87 10 2
4
2 12 87 5
输出样例:
2 is found and deleted.
12 is found and deleted.
87 is found and deleted.
Finding Error: 5 is not in.
5 is inserted as the last element.
Wrong Position for Insertion
Wrong Position for Deletion
10 4 2 5
Position Find( List L, ElementType X ) { if(L==NULL) { return ERROR; } else { while(L!=NULL) { if(L->Data==X) { return L; } L=L->Next; } } return ERROR; } List Insert( List L, ElementType X, Position P ) { List a,q; a=L; q=NULL; if(P==L) { q=(Position)malloc(sizeof(struct LNode)); q->Data=X; q->Next=L; return q; } else { while(L->Next!=P&&L->Next!=NULL) { L=L->Next; } if(L->Next==NULL&&P!=NULL) { printf("Wrong Position for Insertion\n"); return ERROR; } else { q=(Position)malloc(sizeof(struct LNode)); q->Data=X; L->Next=q; q->Next=P; return a; } } } List Delete( List L, Position P ) { List a; a=L; if(L==NULL||P==NULL) { printf("Wrong Position for Deletion\n"); return ERROR; } else { if(P==L) { a=L->Next; return a; } else { while(L->Next!=P&&L->Next!=NULL) { L = L->Next; } if(L->Next==NULL) { printf("Wrong Position for Deletion\n"); return ERROR; } else { L->Next=L->Next->Next; return a; } } } }
7-1 两个有序链表序列的合并(20 分)
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的并集新非降序链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
1 3 5 -1
2 4 6 8 10 -1
输出样例:
1 2 3 4 5 6 8 10
#include<stdio.h> #include<stdlib.h> typedef struct Node* List; struct Node { int data; struct Node *Next; }; List InitList(); void print(List L); void read(List L); void combine(List S1,List S2,List S3); int main() { List S1,S2,S3; S1=InitList(); S2=InitList(); S3=InitList(); read(S1); read(S2); combine(S1,S2,S3); print(S3); return 0; } List InitList() { List L; L=(List)malloc(sizeof(struct Node)); if(!L) { return NULL; } L->Next=NULL; return L; } void print(List L) { L=L->Next; if(L==NULL) { printf("NULL"); return; } while(L) { if(L->Next==NULL) printf("%d",L->data); else printf("%d ",L->data); L=L->Next; } } void read(List L) { List p; int x; scanf("%d",&x); while(x!=-1) { p=(List)malloc(sizeof(struct Node)); if(!p) { return; } p->data=x; p->Next=NULL; L->Next=p; L=p; scanf("%d",&x); } } void combine(List S1,List S2,List S3) { S1=S1->Next; S2=S2->Next; while(S1!=NULL&&S2!=NULL) { if(S1->data>S2->data) { S3->Next=S2; S2=S2->Next; } else { S3->Next=S1; S1=S1->Next; } S3=S3->Next; } if(S1==NULL&&S2==NULL) { return; } if(S1!=NULL) { S3->Next=S1; } else { S3->Next=S2; } return; }
7-2 两个有序链表序列的交集(20 分)
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
#include<stdio.h> #include<stdlib.h> typedef struct Node* List; struct Node { int data; struct Node *Next; }; List InitList(); void print(List L); void read(List L); void Insersection(List S1,List S2,List S3); int main() { List S1,S2,S3; S1=InitList(); S2=InitList(); S3=InitList(); read(S1); read(S2); Insersection(S1,S2,S3); print(S3); return 0; } List InitList() { List L; L=(List)malloc(sizeof(struct Node)); if(!L) { return NULL; } L->Next=NULL; return L; } void print(List L) { L=L->Next; if(L==NULL) { printf("NULL"); return; } while(L) { if(L->Next==NULL) printf("%d",L->data); else printf("%d ",L->data); L=L->Next; } } void read(List L) { List p; int x; scanf("%d",&x); while(x!=-1) { p=(List)malloc(sizeof(struct Node)); if(!p) { return; } p->data=x; p->Next=NULL; L->Next=p; L=p; scanf("%d",&x); } } void Insersection(List S1,List S2,List S3) { List pa,pb,pc,q; pc=S3; pa=S1->Next; pb=S2->Next; while(pa!=NULL&&pb!=NULL) { if(pa->data<pb->data) { pa=pa->Next; } else if(pa->data>pb->data) { pb=pb->Next; } else { q=(List)malloc(sizeof(struct Node)); q->data=pa->data; pc->Next=q; pc=q; pa=pa->Next; pb=pb->Next; } } pc->Next=NULL; }