删除线性表L中第i个元素起的k个元素

这应该是数据结构的题目吧。这题是上课时我同学和我讨论的,当时没用线性表,只是用数组(栈)解决了。现在改用线性表试试,还不是很熟悉。

code:

#include<stdio.h>
#include<stdlib.h>  //或者是 #include<malloc.h> 的头文件
#define N 10

struct Sqlist
{
    int *elem;
    int length;
    int listsize;
}L;

int DeleteK(struct Sqlist *L, int j, int k)
{
    int i;
    for(i = 0; i <= L->length-j-k; i++)     //i=0,而不是i=1,因为第i个是起始元素
        L->elem[i+j-1] = L->elem[j+k+i-1];
    L->length -= k;
    return 0;
}

int main()
{
    int i, j, k;
    L.listsize = N;
    L.elem = (int *)malloc(sizeof(int) * L.listsize); //申请listsize个大小为整型(int)字节的空间

    printf("输入原始线性表:\n");

    for(i = 0; i < N ;i++)
        scanf("%d", &L.elem[i]);

    L.length = L.listsize;

    printf("\n输入起始位置:");
    scanf("%d", &j);
    printf("\n输入要删除元素的个数:");
    scanf("%d", &k);

    DeleteK(&L, j, k);

    for(i = 0; i < N-k; i++)
        printf("%d ", L.elem[i]);

    return 0;
}

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线性表 某软件公司大约有30名员工,每名员工有姓名、工号、职务等属性,每年都有员工离职和入职。 把所有员工按照顺序存储结构建立一个线性表,建立离职和入职函数,当有员工离职或入职时,修改线性表,并且打印最新的员工名单。 约瑟夫(Josephus)环问题:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,直到所有人全部出列为止。 建立n个人的单循环链表存储结构,运行结束后,输出依次出队的人的序号。 栈和队列 某商场有一个100个车位的停车场,当车位未满时,等待的车辆可以进入并计时;当车位已满时,必须有车辆离开,等待的车辆才能进入;当车辆离开时计算停留的的时间,并且按照每小时1元收费。 汽车的输入信息格式可以是(进入/离开,车牌号,进入/离开时间),要求可以随时显示停车场内的车辆信息以及收费历史记录。 某银行营业厅共有6个营业窗口,设有排队系统广播叫号,该银行的业务分为公积金、银行卡、理财卡等三种。公积金业务指定1号窗口,银行卡业务指定2、3、4号窗口,理财卡业务指定5、6号窗口。但如果5、6号窗口全忙,而2、3、4号窗口有空闲时,理财卡业务也可以在空闲的2、3、4号窗口之一办理。 客户领号、业务完成可以作为输入信息,要求可以随时显示6个营业窗口的状态。 5、4阶斐波那契序列如下:f0=f1=f2=0, f3=1,…,fi=fi-1+fi-2+fi-3+fi-4, 利用容量为k=4的循环队列,构造序列的前n+1项(f0, f1 , f2 ,… fn ),要求满足fn ≤200而fn+1 >200。 6、八皇后问题:设8皇后问题的解为 (x1, x2, x3, …,x8), 约束条件为:在8x8的棋盘上,其任意两个xi 和xj不能位于棋盘的同行、同列及同对角线。要求用一位数组进行存储,输出所有可能的排列。 7、迷宫求解:用二维矩阵表示迷宫,自动生成或者直接输入迷宫的格局,确定迷宫是否能走通,如果能走通,输出行走路线。 8、英国人格思里于1852年提出四色问题(four colour problem,亦称四色猜想),即在为一平面或一球面的地图着色时,假定每一个国家在地图上是一个连通域,并且有相邻边界线的两个国家必须用不同的颜色,问是否只要四种颜色就可完成着色。现在给定一张地图,要求对这张地图上的国家用不超过四种的颜色进行染色。 要求建立地图的邻接矩阵存储结构,输入国家的个数和相邻情况,输出每个国家的颜色代码。 9、以下问题要求统一在一个大程序里解决。 从原四则表达式求得后缀式,后缀表达式求值,从原四则表达式求得缀表达式,从原四则表达式求得前缀表达式,前缀表达式求值。 数组与广义表 鞍点问题: 若矩阵A的某一元素A[i,j]是第i行的最小值,而又是第j列的最大值,则称A[i,j]是矩阵A一个鞍点。写出一个可以确定鞍点位置的程序。 稀疏矩阵转置: 输入稀疏矩阵个元素的行号、列号、值,建立稀疏矩阵的三元组存储结构,并将此矩阵转置,显示转置前后的三元组结构。 用头尾链表存储表示法建立广义表,输出广义表,求广义表的表头、广义表的表尾和广义表的深度。 树和二叉树 以下问题要求统一在一个大程序里解决。 按先序遍历的扩展序列建立二叉树的存储结构 二叉树先序、序、后序遍历的递归算法 二叉树序遍历的非递归算法 二叉树层次遍历的非递归算法 求二叉树的深度(后序遍历) 建立树的存储结构 求树的深度 图 输入任意的一个网,用普里姆(Prim)算法构造最小生成树。 要求建立图的存储结构(邻接表或邻接矩阵),输入任意的一个图,显示图的深度优先搜索遍历路径。 要求建立图的存储结构(邻接表或邻接矩阵),输入任意的一个图,显示图的广度优先搜索遍历路径。 查找 设计一个读入一串整数构成一颗二叉排序树的程序,从二叉排序树删除一个结点,使该二叉树仍保持二叉排序树的特性。 24、设定哈希函数 H(key) = key MOD 11 ( 表长=11 ),输入一组关键字序列,根据线性探测再散列解决冲突的方法建立哈希表的存储结构,显示哈希表,任意输入关键字,判断是否在哈希表。 排序 以下问题要求统一在一个大程序里解决。 25、折半插入排序 26、冒泡排序 27、快速排序 28、简单选择排序 29、归并排序 30、堆排序
线性表实验报告 实验的目的要求 了解线性表的逻辑结构特性,以及这种结构特性在计算机内的两种存储结构。 掌握线性表的顺序存储结构的定义及其C语言实现。 掌握线性表的链式存储结构——单链表的定义及其C语言实现。 掌握线性表在顺序存储结构即顺序表的各种基本操作。 掌握线性表在链式存储结构——单链表的各种基本操作。 6、认真阅读和掌握实验的程序。 7、上机运行本程序。 8、保存和打印出程序的运行结果,并结合程序进行分析。 二、 实验的主要内容 题目: 请编制C语言,利用链式存储方式来实现线性表的创建、插入、删除和查找等操作。 具体地说,就是要根据键盘输入的数据建立一个单链表,并输出该单链表;然后根据屏 幕 菜单的选择,可以进行数据的插入或删除,并在插入或删除数据后,再输出单链表;最 后 在屏幕菜单选择0,即可结束程序的运行。 三、 解题思路分析 在链表插入数据,不需要进行大量的数据移动,只需要找到插入点即可,可以采用后 插入的算法,在插入点的后面添加结点。在链表删除数据,先找到删除点,然后进行 指针赋值操作。 四、程序清单 #include<stdio.h> #include<stdlib.h> #include<math.h> typedef int ElemType; typedef struct LNode {ElemType data; struct LNode *next; }LNode; LNode *L; LNode *creat_L(); void out_L(LNode *L); void insert_L(LNode *L,int i,ElemType e); ElemType delete_L(LNode *L,ElemType e); int locat_L(LNode *L,ElemType e); void main() {int i,k,loc; ElemType e,x; char ch; do{printf("\n"); printf("\n 1.建立单链表"); printf("\n 2.插入元素"); printf("\n 3.删除元素"); printf("\n 4.查找元素"); printf("\n 0.结束程序运行"); printf("\n================================"); printf("\n 请输入您的选择(1,2,3,4,0)"); scanf("%d",&k); switch(k) {case 1:{L=creat_L(); out_L(L); }break; case 2:{printf("\n请输入插入位置:"); scanf("%d",&i); printf("\n请输入要插入元素的值:"); scanf("%d",&e); insert_L(L,i,e); out_L(L); }break; case 3:{printf("\n请输入要删除元素的位置:"); scanf("%d",&i); x=delete_L(L,i); out_L(L); if(x!=-1) {printf("\n删除的元素为:%d\n",x); printf("删除%d后的单链表为:\n",x); out_L(L); } else printf("\n要删除的元素不存在!"); }break; case 4:{printf("\n请输入要查找的元素值:"); scanf("%d",&e); loc=locat_L(L,e); if(loc==-1)printf("\n为找到指定元素!"); else printf("\n已找到,元素位置是%d",loc); }break; } printf("\n----------------"); }while(k>=1&&k<5); printf("\n 按回车键,返回...\n"); ch=getchar(); } LNode *creat_L() { LNode *h,*p,*s; ElemType x; h=(LNode *)malloc(sizeof(LNode)); h->next=NULL; p=h; printf("\n请输入第一个数据元素:"); scanf("%d",&x); while(x!=-999) {s= (LNode *)malloc(sizeof(LNode)); s->data=x; s->next=NULL; p->next=s; p=s; printf("请输入下一个数据:(输入-999表示结束.)"); scanf("%d",&x); } return(h); } void out_L(LNode*L) { LNode*p; p=L->next; printf("\n\n");
1. 顺序存储结构数据数据元素之间逻辑关系是由( )表示的,链接存储结构的数据元素之间的逻辑关系是由( )表示的。 A.线性结构 B.非线性结构 C.存储位置 D.指针 2. 线性表是( )。 A.一个有限序列,可以为空 B. 一个有限序列,不能为空 C. 一个无限序列,可以为空 D. 一个无限序列,不能为空 3. 已知一维数组A采用顺序存储结构,每个元素占用4个存储单元,第9个元素的地址为144,则第一个元素的地址是( )。 A. 108 B. 180 C. 176 D. 112 4. 在单链表删除指针p所指结点的后继结点,则执行( )。 A. p->next= p->next->next B. p->next= p->next C. p= p->next->next D. p= p->next; p->next= p->next->next 5. 若某链表最常用的操作是在最后一个结点之后插入一个结点删除最后一个结点,则采用( )存储方式最节省时间。 A. 单链表 B. 双链表 C. 带头结点的双循环链表 D. 单循环链表 6.二维数组A[7][8]以列序为主序的存储, 计算数组元素A[5][3] 的一维存储空间下标 k=( )。 A. 38 B. 43 C. 26 D. 29 二、完成下列填空题(每空3分,共9分)。 1.在顺序表L第i个位置上插入一个新的元素e: Status ListInsert_Sq(SqList &L , int i , ET e){ if ( iL.length+1) return ERROR; if(L.length >= L.listsize){ p=(ET*)realloc(L.elem,(L.listsize+10)*sizeof(ET)); if (p==NULL) exit(OVERFLOW); L.elem=p; } for( j=L.length ; j>=i ; --j ) L.elem[j]=L.elem[j-1] ; L.elem[j]=e ; ++L.length ; return OK; } 2. 删除双向链表p所指向的节点算法: status delete(DuLinkList L, DuLinkList p) { if (p= =L) return ERROR; else { p->prior->next=p->next; p->next->prior=p->prior ; } free(p); return OK; } 三、编程题(共27分)。 1. (共12分)用顺序表表示集合,设计算法实现集合的求差集运算,要求不另外开辟空间。 顺序表的存储结构定义如下: #define Maxsize 100 typedef struct { ElemType data[MaxSize]; // ElemType表示不确定的数据类型 int length; // length表示线性表的长度 }SqList; 将如下函数,伪码补充完整(8分),代码前先用文字描述自己的算法思想(4分)。 文字描述算法:略(4分) void Difference(SqList A, SqList B) {//参考代码如下如下(8分) for (i=0;i<A.length;i++) for(j=0;j<B.length;j++) if(A.data[i]==B.data[j]) { A.data[i]=’#’; break; } for (k=0,i=0;inext == L) return; p = L; while (p->next != L)   { if (p->next->data != e) P = p->next; else { q = p->next;p->next = q->next; free(q);} } } 时间复杂度分析:(2分) 时间复杂度为O(n)。
### 回答1: 算法如下: 1. 判断i和k是否合法,即i+k是否超出线性表的范围,若超出则删除失败,返回原线性表。 2. 从第i+k个元素开始,将其后面的元素向前移动k个位置,覆盖掉要删除的元素。 3. 将线性表的长度减去k,即可删除k个元素。 具体实现如下: void delete_k_elements(int i, int k, int l[]) { int len = sizeof(l) / sizeof(l[]); // 获取线性表长度 if (i + k > len) { // 判断i和k是否合法 printf("删除失败,超出线性表范围"); return; } for (int j = i + k; j < len; j++) { // 将后面的元素向前移动k个位置 l[j - k] = l[j]; } len -= k; // 删除k个元素 } ### 回答2: 解决这个问题的算法需要几个步骤。我们可以从起点i开始,将从i+k到线性表的最后一个位置的所有元素依次向前移动k个位置。这样就会将要删除的k个元素覆盖掉。最后,我们再将线性表的长度减去k即可。 下面是详细的算法: 首先,检查输入的参数是否合法:如果i小于0或k小于1,或者i+k大于线性表的长度,则输入不合法,返回错误信息。 然后,我们需要使用循环来完成移动元素的工作。我们从i+k位置开始,一直到线性表的最后一个位置,每个元素都要依次向前移动k个位置。 移动元素后,将线性表的长度减去k,以便删除的元素占据的空间被释放。 最后,返回成功删除元素后的线性表。 下面是算法的伪代码实现: def delete_elements(l, i, k): # 检查输入是否合法 if i < 0 or k < 1 or i + k > len(l): return "输入不合法" # 移动元素 for j in range(i + k, len(l)): l[j-k] = l[j] # 删除元素后更新线性表的长度 l = l[:len(l)-k] return l 这个算法的时间复杂度为O(n),其n是线性表的长度。它的空间复杂度也为O(n),因为它需要操作原始的线性表。 ### 回答3: 删除线性表指定位置的元素,需要在顺序表l按照一定的规则进行操作。 我们可以采用以下步骤来完成该算法: 1、检查线性表长度:首先,我们需要确保线性表l包含足够的元素以容纳删除操作。如果线性表长度小于开始位置i+k,则删除操作无法完成,我们需要给出相应的错误提示。 2、从第i个元素开始遍历:从要删除元素的位置i开始,我们需要遍历线性表l,并用i+k作为截止点。 3、覆盖被删除元素的位置:首先,我们需要将i和i+k之间的元素从线性表l删除。为了完成这一步骤,我们可以简单地将原始位置i+k后面的元素前移k个位置,以覆盖被删除元素的位置。 4、修改线性表长度:最后,我们需要调整线性表的长度,以避免添加位置可能会覆盖旧数据。在删除k个元素后,我们应该将线性表l的长度减去k。 总结来说,我们可以通过检查线性表长度、遍历线性表、覆盖被删除元素位置和修改线性表长度来实现从线性表删除从第i个元素开始的k个元素算法。这个算法的时间复杂度是O(n),其n是线性表的长度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值