数据结构与算法PTA 6-1【顺序表】(C语言)

题目:

要求根据顺序表定义和已有操作,编码完成其他的10个操作。

顺序表的定义和已有操作:

#define N 10 
typedef int ElemType;
typedef struct{
        ElemType data[N];
        int last;
}SeqList;

SeqList * InitList();
void TraverseList(SeqList * list);

需要你来编写的其他操作:

// 插入成功则返回0。如果pos非法则返回-1。如果顺序表已满则返回-2。
// 第1个测试点的数据用于评测本函数。
int ListInsert(SeqList * list, int pos, ElemType value);

// 成功删除则返回0。如果pos非法则返回-1。如果顺序表为空则返回-2。
// 第2个测试点的数据用于评测本函数。
int ListDelete(SeqList * list, int pos);

// 找到数据元素old_value并修改为new_value,如果修改成功则返回0, 否则返回-1。
// 第3个测试点的数据用于评测本函数。
int ListModify(SeqList * list, ElemType old_value, ElemType new_value);

// 返回数据元素value对应的下标。如果不存在该元素,则返回-1。
// 第4个测试点的数据用于评测本函数。
int ListPosition(SeqList * list, ElemType value);

// 删除顺序表中重复的数据元素。返回值是被删除元素的个数
// 第5个测试点的数据用于评测本函数。
int ListPurge(SeqList * list);

// 合并顺序表list1和list2:把list2的元素(如果该元素在list1中已经存在则不需要合并)依次插入到list1的末尾。
// 返回值是list2插入到list1的元素个数。
// 第6个测试点的数据用于评测本函数。
int MergeList(SeqList * list1, SeqList * list2);

// 重置(清空)顺序表
// 第7个测试点的数据用于评测本函数。
void ResetList(SeqList * list);

// 如果顺序表为空,则返回1,否则返回0。
// 第8个测试点的数据用于评测本函数。
int IsListEmpty(SeqList * list);

// 如果顺序表已满则返回1,否则返回0。
// 第9个测试点的数据用于评测本函数。
int IsListFull(SeqList * list);

// 返回顺序表的长度
// 第10个测试点的数据用于评测本函数。
int ListLength(SeqList * list);

 裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

#define N 10 
typedef int ElemType;
typedef struct{
        ElemType data[N];
        int last;
}SeqList;

SeqList * InitList();
void TraverseList(SeqList * list);
int IsListFull(SeqList * list);
int ListInsert(SeqList * list, int pos, ElemType value);
void ResetList(SeqList * list);
int IsListEmpty(SeqList * list);
int ListDelete(SeqList * list, int pos);
int ListLength(SeqList * list);
int ListPosition(SeqList * list, ElemType value);
int ListModify(SeqList * list, ElemType old_value, ElemType new_value);
int ListPurge(SeqList * list);
int MergeList(SeqList * list1, SeqList * list2);

SeqList * InitList()
{
        SeqList * list = (SeqList *)malloc(sizeof(SeqList));
        list->last = -1;
        return list;
}

void TraverseList(SeqList * list)
{
        int i;
        printf("[");
        for(i = 0;i <= list->last;i++){
                printf("%d ", list->data[i]);
        }
        printf("]\n");
}

int main()
{
        int i, n, opt, pos, data, old_value, new_value;
        SeqList * list = InitList();
        SeqList * list2 = InitList();

        do{
                scanf("%d", &opt);
                if(opt == 1){
                        scanf("%d", &n);
                        for(i = 0;i < n;i++){
                                scanf("%d %d", &pos, &data);    
                                printf("%d\n", ListInsert(list, pos, data));
                                TraverseList(list);
                        }
                }else if(opt == 2){
                        scanf("%d", &n);
                        for(i = 0;i < n;i++){
                                scanf("%d", &pos);      
                                printf("%d\n", ListDelete(list, pos));
                                TraverseList(list);
                        }       
                }else if(opt == 3){
                        scanf("%d", &n);
                        for(i = 0;i < n;i++){
                                scanf("%d %d", &old_value, &new_value); 
                                printf("%d\n", ListModify(list, old_value, new_value));
                                TraverseList(list);
                        }       
                }else if(opt == 4){
                        scanf("%d", &n);
                        for(i = 0;i < n;i++){
                                scanf("%d", &data);     
                                printf("%d\n", ListPosition(list, data));
                                TraverseList(list);
                        }       
                }else if(opt == 5){
                        scanf("%d", &n);
                        for(i = 0;i < n;i++){
                                scanf("%d %d", &pos, &data);    
                                printf("%d\n", ListInsert(list, pos, data));
                        }
                        TraverseList(list);
                        printf("%d\n", ListPurge(list));
                        TraverseList(list);
                }else if(opt == 6){
                        scanf("%d", &n);
                        for(i = 0;i < n;i++){
                                scanf("%d %d", &pos, &data);    
                                printf("%d\n", ListInsert(list2, pos, data));
                        }
                        printf("%d\n", MergeList(list, list2));
                        TraverseList(list);
                        TraverseList(list2);
                }else if(opt == 7){
                        ResetList(list);
                        TraverseList(list);
                }else if(opt == 8){
                        printf("%d\n", IsListEmpty(list));
                }else if(opt == 9){
                        printf("%d\n", IsListFull(list));
                }else if(opt == 10){
                        printf("%d\n", ListLength(list));
                }
        }while(opt != 0);
        return 0;
}

/* 请在这里填写答案 */

输入样例:

在这里给出一组输入。例如:

1
3
0 300
3 200
0 100
0

输出样例:

在这里给出相应的输出。例如:

0
[300 ]
-1
[300 ]
0
[100 300 ]

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

 答案:

int ListInsert(SeqList * list, int pos, ElemType value) {
 if (pos < 0 || pos > list->last + 1) { 
 return -1; 
 } if (list->last == N - 1) { 
 return -2; 
 } 
 for (int i = list->last; i >= pos; i--) {
  list->data[i+1] = list->data[i]; 
  } 
  list->data[pos] = value;
   list->last++; 
   return 0; 
   }

int ListDelete(SeqList * list, int pos) {
 if (pos < 0 || pos > list->last) { 
 return -1; 
 } 
 if (list->last == -1) {
  return -2; 
  } 
 for (int i = pos; i < list->last; i++) {
      list->data[i] = list->data[i + 1]; 
  } 
  list->last--; 
  return 0; 
  }

int ListModify(SeqList * list, ElemType old_value, ElemType new_value) { 
 for (int i = 0; i <= list->last; i++) {
	if (list->data[i] == old_value) {
	  list->data[i] = new_value; 
	  return 0;
		} 
	} 
   	return -1;
} 
    
int ListPosition(SeqList * list, ElemType value){ 
	int i = 0; 
	for (i = 0; i <= list->last; i++) { 
		if (list->data[i] == value) { 
			return i;
	 	} 
	 } 
 	return -1; 
 }

int ListPurge(SeqList * list) {
 int count = 0, i = 0, j = 0; 
 for (i = 0; i < list->last; i++) {
    for (j = i + 1; j <= list->last; j++) { 
  	if (list->data[i] == list->data[j]) { 
  		ListDelete(list, j); 
	    count++;
		j--; 
  		} 
  	} 
  }
   return count; 
  }

int MergeList(SeqList * list1, SeqList * list2) {
 int num = 0;
  for (int i = 0; i <= list2->last; i++) {
  	if (ListPosition(list1, list2->data[i]) == -1) {
	   ListInsert(list1, list1->last + 1, list2->data[i]); 
	   num++; 
   		}
    }
	 return num;
}

void ResetList(SeqList * list) { 
	list->last = -1; 
}

int IsListEmpty(SeqList * list) { 
if (list->last == -1) {
 	return 1; 
	} else { 
	 	return 0; 
	} 
}

int IsListFull(SeqList * list) {
 if (list->last == N - 1) { 
 return 1; 
 } else { 
 	return 0; 
 } 
}

int ListLength(SeqList * list) {
 	return list->last + 1 ; 
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值