6-7 单链表遍历
本题要求实现一个函数,输出带头结点的单链表的的所有结点元素值。
函数接口定义:
void Traverse ( LinkList L );
其中LinkList结构定义如下:
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
L是带头结点的单链表的头指针。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList Create ();/* 细节在此不表 */
void Traverse ( LinkList L );
int main()
{
LinkList L = Create();
Traverse(L);
return 0;
}
/* 请在这里填写答案 */
输入样例:
输入是以-1结束的整数序列,-1不属于单链表元素,整数之间空格分隔。
2 1 4 5 3 -1
输出样例:
输出单链表所有元素,格式为每个整数后面跟一个空格。
2 1 4 5 3
代码示例:
void Traverse ( LinkList L ){
LinkList p = L->next;
while(p){
printf("%d ",p->data);
p = p->next;
}
}
6-8 求单链表的表长
本题要求实现一个函数,求带头结点的单链表的表长。
函数接口定义:
int Length ( LinkList L );
其中LinkList结构定义如下:
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
L是带头结点的单链表的头指针,函数Length返回单链表的长度。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList Create();/* 细节在此不表 */
int Length ( LinkList L );
int main()
{
LinkList L = Create();
printf("%d\n", Length(L));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
2 1 4 5 3 -1
输出样例:
5
代码示例:
int Length ( LinkList L ){
int length = 0;
LinkList p = L->next;
while(p){
length++;
p = p->next;
}
return length;
}
6-9 求单链表元素序号
本题要求实现一个函数,求带头结点的单链表中元素序号。
函数接口定义:
int Locate ( LinkList L, ElemType e);
L是带头结点的单链表的头指针,e是要查找的元素值。如果e在单链表中存在,函数Locate返回其序号(序号从1开始);否则,返回0。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList Create();/* 细节在此不表 */
int Locate ( LinkList L, ElemType e);
int main()
{
ElemType e;
LinkList L = Create();
scanf("%d",&e);
printf("%d\n", Locate(L,e));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
2 1 4 5 3 -1
5
输出样例:
4
代码示例:
int Locate ( LinkList L, ElemType e){
LinkList p = L->next;
if(!p) return 0;
int num = 0;
while(p){
num++;
if(p->data==e)
return num;
p = p->next;
}
return 0;
}
6-10 统计单链表元素出现次数
本题要求实现一个函数,统计带头结点的单链表中某个元素出现的次数。
函数接口定义:
int GetCount ( LinkList L,ElemType e );
L是带头结点的单链表的头指针,e是要统计次数的元素值。如果e在单链表中存在,函数GetCount返回其出现的次数;否则,返回0。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList Create();/* 细节在此不表 */
int GetCount ( LinkList L, ElemType e);
int main()
{
ElemType e;
LinkList L = Create();
scanf("%d",&e);
printf("%d\n", GetCount(L,e));
return 0;
}
LinkList Create()
{
LinkList L,r,p;
ElemType e;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
r = L;
scanf("%d",&e);
while(e!=-1)
{
p = (LinkList)malloc(sizeof(LNode));
p->data = e;
p->next = r->next;
r->next = p;
r = p;
scanf("%d",&e);
}
return L;
}
/* 你的代码将被嵌在这里 */
输入样例1:
2 2 4 2 3 -1
2
输出样例1:
3
代码示例:
int GetCount ( LinkList L,ElemType e ){
LinkList p = L->next;
if(!p) return 0;
int count = 0;
while(p){
if(p->data==e)
count++;
p = p->next;
}
return count;
}
6-11 带头结点的单链表就地逆置
本题要求实现一个函数,对带有头结点的单链表进行就地逆置。
函数接口定义:
void reverse ( LinkList L );
L是带头结点的单链表的头指针。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList Create();
void print(LinkList L);
void reverse ( LinkList L);
int main()
{
LinkList L = Create();
print(L);
printf("\n");
reverse(L);
print(L);
return 0;
}
LinkList Create()
{
LinkList L,p,s;
ElemType e;
L = (LinkList)malloc(sizeof(LNode));
p=L;
scanf("%d",&e);
while(e!=-1)
{
s = (LinkList)malloc(sizeof(LNode));
s->data=e;
p->next = s;
p=s;
scanf("%d",&e);
}
p->next=NULL;
return L;
}
void print(LinkList L)
{
LinkList p;
p=L->next;
while (p)
{
printf("%d ", p->data);
p =p->next;
}
}
/* 请在这里填写答案 */
输入样例:
1 2 3 4 5 6 -1
输出样例:
1 2 3 4 5 6
6 5 4 3 2 1
代码示例:
void reverse ( LinkList L ){
LinkList p=NULL;
LinkList c=L->next;
LinkList nextNode = NULL;
while(c){
nextNode=c->next;
c->next=p;
p=c;
c=nextNode;
}
L->next=p;
}
6-12 带头结点的单链表插入操作
本题要求实现带头结点的单链表插入操作,插入成功返回1,否则返回0。
函数接口定义:
int insert_link ( LinkList L,int i,ElemType e);
L是单链表的头指针,i为插入位置,e是插入的数据元素,插入成功返回1,否则返回0。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList Create();/* 细节在此不表 */
void print( LinkList L);
int insert_link ( LinkList L,int i,ElemType e);
int main()
{
int position,insert_data;int flag;
LinkList L = Create();
scanf("%d",&position);
scanf("%d",&insert_data);
flag=insert_link(L,position,insert_data);
if(flag)
{
print(L);
}
else
{
printf("Wrong Position for Insertion");
}
return 0;
}
void print(LinkList L)
{
LinkList p;
p=L->next;
while (p)
{
printf("%d ", p->data);
p =p->next;
}
}
/* 请在这里填写答案 */
输入格式:
输入数据为三行,第一行是若干正整数,最后以-1表示结尾(-1不算在序列内,不要处理)。所有数据之间用空格分隔。
第二行数据是插入位置,第三行数据是被插入元素值。
输入样例:
1 2 3 4 5 6 -1
2
100
输出样例:
1 100 2 3 4 5 6
代码示例:
int insert_link ( LinkList L,int i,ElemType e){
LinkList p = L;
if(!p) return 0;
int c = 0;
LinkList Node = (LinkList)malloc(sizeof(LNode));
while(p){
c++;
if(c == i){
Node->data = e;
Node->next = p->next;
p->next = Node;
return 1;
}
p = p->next;
}
return 0;
}
6-7 带头结点的单链表删除操作
本题要求实现删除单链表的第i个元素结点,删除成功返回1,否则返回0。
函数接口定义:
int delete_link ( LinkList L,int i);
L为单链表的头指针,i为删除结点的序号。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList Create();/* 细节在此不表 */
void print( LinkList L);
int delete_link ( LinkList L,int i);
int main()
{
LinkList L = Create();
int position;int flag;
scanf("%d",&position);
flag=delete_link(L,position);
if(flag)
{
print(L);
}
else
{
printf("Wrong Position for Deletion");
}
return 0;
}
void print(LinkList L)
{
LinkList p;
p=L->next;
while (p)
{
printf("%d ", p->data);
p =p->next;
}
}
/* 请在这里填写答案 */
输入格式:
输入数据为两行,第一行是若干正整数,最后以-1表示结尾(-1不算在序列内,不要处理)。所有数据之间用空格分隔。
第二行数据是删除位置。
输入样例:
1 2 3 4 5 6 -1
3
输出样例:
1 2 4 5 6
代码示例:
int delete_link ( LinkList L,int i){
LinkList p = L;
if(!p||i<1) return 0;
int c = 0;
while(p->next){
c++;
if(c == i){
p->next = p->next->next;
return 1;
}
p = p->next;
}
return 0;
}
6-8 在带头结点的单链表表尾处插入一个新元素
本题要求实现一个函数,在带头结点的单链表表尾处插入一个新元素e。
函数接口定义:
void insert ( LinkList L,ElemType e);
L是单链表的头指针,e是插入的数据元素。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList Create();
void print(LinkList L);
void insert ( LinkList L,ElemType e);
int main()
{
int e;
LinkList L = Create();
print(L);
printf("\n");
scanf("%d",&e);
insert(L,e);
print(L);
return 0;
}
LinkList Create()
{
LinkList L,p,s;
ElemType e;
L = (LinkList)malloc(sizeof(LNode));
p=L;
scanf("%d",&e);
while(e!=-1)
{
s = (LinkList)malloc(sizeof(LNode));
s->data=e;
p->next = s;
p=s;
scanf("%d",&e);
}
p->next=NULL;
return L;
}
void print(LinkList L)
{
LinkList p;
p=L->next;
while (p)
{
printf("%d ", p->data);
p =p->next;
}
}
/* 请在这里填写答案 */
输入样例:
1 2 3 4 5 6 -1 100
输出样例:
1 2 3 4 5 6
1 2 3 4 5 6 100
代码示例:
void insert ( LinkList L,ElemType e){
LinkList p = L;
LinkList s = (LinkList)malloc(sizeof(LNode));
if(!p){
L->next = s;
s->next = NULL;
s->data = e;
}
while(p->next){
p = p->next;
}
s->next = p->next;
p->next = s;
s->data = e;
}
6-9 删除非空单链表的表尾元素
本题要求实现一个函数,删除带头结点的非空单链表的表尾元素。
函数接口定义:
void deletetail ( LinkList L);
L是单链表的头指针。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList Create();
void print(LinkList L);
void deletetail ( LinkList L);
int main()
{
LinkList L = Create();
print(L);
printf("\n");
deletetail(L);
print(L);
return 0;
}
LinkList Create()
{
LinkList L,p,s;
ElemType e;
L = (LinkList)malloc(sizeof(LNode));
p=L;
scanf("%d",&e);
while(e!=-1)
{
s = (LinkList)malloc(sizeof(LNode));
s->data=e;
p->next = s;
p=s;
scanf("%d",&e);
}
p->next=NULL;
return L;
}
void print(LinkList L)
{
LinkList p;
p=L->next;
while (p)
{
printf("%d ", p->data);
p =p->next;
}
}
/* 请在这里填写答案 */
输入样例:
18 299 -1
输出样例:
18 299
18
代码示例:
void deletetail ( LinkList L){
LinkList p = L->next;
if(!p->next){
L->next = p->next;
free(p);
}
while(p->next->next){
p = p->next;
}
p->next = NULL;
}