顺序表去重

实验目的:

假设顺序表的长度为n,且n的取值空间为[1, 100],顺序表各结点的数值为整型,且数值大小为[1, 100]。

删除顺序表中相同数值的多余结点,即顺序表中相同数值的结点只保留一个。

实验要求:

1、顺序表定义使用以下代码:

typedef int datatype; //结点的数据类型,假设为int
const int maxsize=100; //顺序表最大长度,假设为100
typedef struct {
datatype data[maxsize]; //顺序表的第一个结点为data[0]
int n; //顺序表的当前长度
} sqlist;
2、自定义顺序表长度和各结点的数值

输入
程序启动后,依次input的信息如下:

1、第一行,输入一个数值n,表示顺序表的长度

(提示:判断顺序表长度是否符合要求,若不符合,则输出提示信息“Exception: illegal length”)

2、第二行,输入一串以空格分开的数值,表示顺序表的各个结点数值

(提示:判断顺序表各结点的数值是否符合要求,若不符合,则输出提示信息“Exception: illegal value”)

输出
完成上述所有input信息后,程序依次output的信息如下:

1、打印“去重”后的顺序表元素个数

2、打印“去重”后的顺序表

输入样例 1

10
1 5 8 2 4 6 5 2 4 6
输出样例 1

6
1 5 8 2 4 6
输入样例 2

0
输出样例 2

Exception: illegal length
输入样例 3

5
201 2 2 5 4
输出样例 3

Exception: illegal value
代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
const int maxsize = 100;
typedef struct{
   datatype data[maxsize];
   int n;
}sqlist;
void init(sqlist* list , int n ){
   list->n = n;
}
void looklist(sqlist* list){
   for(int i = 0 ; i < list->n ; i++){
     printf("%d",list->data[i]);
     if(i < list->n - 1){
      printf(" ");
     }
   }
   printf("\n");
}
void delectsame(sqlist* list){
   int k = 0 ;
   for(int i = 0 ; i < list->n - 1 ; i++){
     for(int j = i + 1 ; j < list->n ; j++){
       if(list->data[i] == list->data[j]){
         for(k = j;k < list->n ; k++){
           list->data[k] == list->data[k+1];
         }
         list->n--;
         j--;
       }
     }
   }
}
int main(){
   sqlist* list = (sqlist*)malloc(sizeof(sqlist));
   int n;
   scanf("%d",&n);
   init(list,n);
   if(n <= 0 || n > maxsize){
     printf("Exception: illegal length\n");
     return 0;
   }
   for(int i = 0 ; i < n ; i ++){
     scanf("%d",&list->data[i]);
   }
   for(int i = 0 ; i < n ; i ++){
     if(list->data[i] < 1 || list->data[i] > 100){
       printf("Exception: illegal value\n");
       return 0;
     }
 }
   delectsame(list);
   printf("%d\n",list->n);
   looklist(list);
   return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值