数据结构:用C语言实现非递减有序表的合并

本文档详细介绍了如何使用C语言实现非递减有序表的合并及线性表的基本操作,包括初始化、插入、删除、显示、求前驱和后继等。在合并操作中,重复元素只保留一个。实验要求强调了程序的健壮性和错误处理,提供了完整的测试用例以确保功能的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验要求

(1)实验目的

通过该实验,深入理解顺序表的逻辑结构、物理结构等概念,掌握顺序表基本操作的编程实现,注意顺序表插入、删除等操作过程中数据元素的移动现象,培养学生编写程序时,要考虑程序的健壮性,全面考虑问题,熟练掌握通过函数参数返回函数结果的办法。

(2)实验内容

编程实现顺序表下教材第二章定义的线性表的基本操作,并根据已经实现的基本操作,实现两个非递减有序的线性表的合并,注意,合并时,如果有重复的元素,请保留一个。

(3)实验要求

(a)求前驱是指,输入一个元素值(而不是位置),求该元素在顺序表中的直接前驱元素值。求后继是指:输入一个元素值(而不是位置),求该元素在顺序表中的直接后继元素值;(b)为了方便修改数据元素的类型,请使用类型重定义,可以方便修改线性表中的数据元素的类型;(c)大部分函数的返回结果应是函数执行是否成功的一种状态,执行成功了,才返回具体的结果值;(d)对每个功能进行测试时,要求把不合法的情况也测试一下。具体见下面的测试用例;(e)采用菜单形式对应各个操作,使其编成一个完整的小软件,参考界面如下。

在这里插入图片描述

注:销毁是指free(L.elem); L.elem=NULL; L.length=0; L.listsize=0; return TRUE。清空是指:L.length=0 ;return TRUE。

(3)验收/测试用例

通过菜单调用各个操作,测试点:

l 没有初始化前进行其他操作,程序是否能控制住;即,如果没有初始化线性表,其他的功能是无法正常进行的,如果选择进行其他操作,要提示先进行初始化;

l 初始化一个顺序表(初始化顺序表,是指初始化一个空的线性表,里面的元素个数是0);

l 插入数据(位置, 数据),要测插入位置不合法的情况(0,1)、(2,1),正确插入3个数据(1,20)、(1,10)、(3,30);

l 显示顺序表中的数据,屏幕输出10, 20, 30;

l 判空,屏幕输出顺序表非空;

l 输出顺序表长度,屏幕输出3;

l 获取指定位置元素,要测指定位置在【1,3】范围之外的情况和之内的情况;

l 定位,输入:40, 输出:不存在,输入20,输出位置为2;

l 求直接前驱,要测求第一个元素的前驱、不存在顺序表中的元素的直接前驱,其他元素的直接前驱;输入10,输出:第一个元素没有前驱,输入20,输出前驱是10,输入40,输出该元素不存在;

l 求直接后继,要测最后一个元素的后继、不存在顺序表中的元素的直接后继,其他元素的直接后继;同上求前驱;

l 删除,要测位置在【1,3】范围之外的情况和之内的情况;

l 清空操作后再测长度,判断是否为空;

l 销毁顺序表,销毁线性表之后还能不能做插入,删除等操作,如果选其他操作,就要提示线性表已经销毁不存在;

l 测试合并操作,第一个线性表中的元素是(2,3,4,5),第二个线性表中的内容是(1,4,5,6,7),合并后的结果,请输出。

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

typedef struct Node{
   
 int data;
 struct Node *next;
}Node,*Link; 

void show(){
   
 printf("\t\t\t 1---初始化一个线性表\n");
 printf("\t\t\t 2---销毁线性表\n");
 printf("\t\t\t 3---清空线性表\n");
 printf("\t\t\t 4---判断线性表是否为空\n");
 printf("\t\t\t 5---求线性表长度\n");
 printf("\t\t\t 6---获取线性表中指定位置的元素\n");
 printf("\t\t\t 7---获取线性表元素的位置\n");
 printf("\t\t\t 8---求前驱\n");
 printf("\t\t\t 9---求后继\n");
 printf("\t\t\t 10--在线性表指定位置插入元素\n");
 printf("\t\t\t 11--删除线性表指定位置的元素\n");
 printf("\t\t\t 12--显示线性表\n");
 printf("\t\t\t 13--合并两个非递减有序的线性表\n"); 
 printf("\t\t\t 退出,输入一个负数!");
 printf("\n");
 printf("\t\t----------------------------------------------\n");
 printf("\n");
}

//初始化线性表
Link list(Link head){
   
 head = (Link)malloc(sizeof(Node));
 if(head == NULL){
   
  return 0;
 }
 head->next=NULL; 
 Link p,r,s,t;
 int i,sum,num;
 r = head;
 printf("请输入元素总个数:\n");
 scanf("%d",&sum); 
 printf("请输入元素:\n");
 for(i=0;i<sum;i++){
   
  p=(Link)malloc(sizeof(Node));
  if(p){
   
   scanf("%d",&p->data);
   r->next=p;
   r=p;
  }
 }
 /*     这个地方出过错,以为下面排序是基于s!=NULL和
 t!=NULL为循环条件的,所以这个把尾节点置空必不可少。 
*/
 r->next=NULL;
 //把乱的链表排序,类似冒泡排序。 
 s=head->next;
 while(s){
   
  num=s->data; 
  t=s->next;
  while(t){
   
   if(num > t->data){
   
    int tamp=t->data;
    t->data=num
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值