求数据结构算法题详细解题步骤已知线性表中的结点以关键字非递减有序排列,并以带头结点的单链表作存储结构。请写一算法,删除表

本痴2022-10-04 11:39:541条回答

求数据结构算法题详细解题步骤
已知线性表中的结点以关键字非递减有序排列,并以带头结点的单链表作存储结构。请写一算法,删除表中关键字值为K的结点,同时释放被删结点的空间

已提交,审核后显示!提交回复

共1条回复
sinkc 共回答了21个问题 | 采纳率81%
#include
using namespace std;


typedef struct LNode
{
int data;
struct LNode *next;
}LinkList;

LNode *ptr;

void CreateHeadNode(LNode *&h)
{
h = (LNode*)malloc(sizeof(LNode));
h->next = NULL;
ptr = h;
}

void Destory(LNode *&h)
{
LNode*p = NULL;
while(h->next)
{
p = h;
h = h->next;
free(p);
}
}


void Insert(int value)
{
LNode *node;
node = (LNode*)malloc(sizeof(LNode));
node->data = value;
node->next = NULL;
ptr->next = node;
ptr = node;
}


void DeleteNode(LNode *&head, int data)
{
LNode *curr = head->next;//当前节点
LNode *pre = head;//当前节点的前驱节点
//找到删除位置
while (curr != NULL curr->data < data)
{
pre = curr;
curr = curr->next;
}

//删除节点,可能有连续多个需要删除
while (curr != NULL curr->data == data)
{
LNode*del = curr;
pre->next = curr->next;
curr = curr->next;
free(del);
}
}



void DispList(LinkList *L )
{
LinkList *p = L->next;
while(p != NULL)
{
cout<data<<" ";
p = p->next;
}
cout<}

int main()
{
int data;
LinkList *list;
int arr[] = {0, 1, 3, 3, 3 ,4, 5, 6, 7, 8};

CreateHeadNode(list);
for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
{
Insert(arr[i]);
}

cout<<"删除前:";

DispList(list);

cout<<"输入待删除的节点值:";
cin>>data;
DeleteNode(list, data);

cout<<"删除后:";
DispList(list);

Destory(list);
return 0;
}

vs2005测试通过:
删除前:0 1 3 3 3 4 5 6 7 8 8 9
输入待删除的节点值:3
删除后:0 1 4 5 6 7 8 8 9
Press any key to continue . . .

删除前:0 1 3 3 3 4 5 6 7 8 8 9
输入待删除的节点值:5
删除后:0 1 3 3 3 4 6 7 8 8 9
Press any key to continue . . .

删除前:0 1 3 3 3 4 5 6 7 8 8 9
输入待删除的节点值:9
删除后:0 1 3 3 3 4 5 6 7 8 8
Press any key to continue . . .
1年前

相关推荐

求用数据结构算法解决实验实验内容:解决约瑟夫问题:假设有n个人按1、2、3、…、n的顺序围成一圈,现在,从第s个人开始按
求用数据结构算法解决实验
实验内容:解决约瑟夫问题:假设有n个人按1、2、3、…、n的顺序围成一圈,现在,从第s个人开始按1、2、3、…、m的顺序报数,数到m的人出圈,接着从出圈的下一个人开始重复此过程,直到所有人出圈为止.试用顺序表解决这个问题.
请用算法描述并写出程序清单!
浙江花样男1年前1
xuesong521 共回答了16个问题 | 采纳率100%
/* */
#include
#define size 100 /* 输入人数的上限 */
void main()
{
int person[size];
int i, j; /* 循环修正变量 */
int arrayLen; /* 数组长度 */
int start, overNum; /* 开始位置各跨过位置 */
int deleNum; /* 出列人所在数组中的下标 */
int name, total; /* 输入时,人的信息以及人的总数 */
printf( "请输入圆桌上人的总数: " );
scanf( "%d", &arrayLen ); printf( "n" );
if( ( arrayLen > size ) || ( arrayLen < 0 ) )
{
printf( "超出范围,请重新输入: " );
scanf( "%d", &arrayLen ); printf( "n" );
};
printf( "请输入各个人的信息(整数): n" );
for( i = 0; i < arrayLen; i++ )
{
scanf( "%d", &name );
person[i] = name;
}
printf( "你输入的数据的顺序为: n" );
for( i = 0; i < arrayLen - 1; i++ )
printf( " %d ==>", person[i] );
printf( "%d n", person[arrayLen - 1] );
printf( "你打算从第几个人开始? 请输入开始号: " );
scanf( "%d", &start );
printf( "n" );
start = start - 1;
printf( "请输入相邻两出列人之间的间隔: " );
scanf( "%d", &overNum );
printf( "n" );

total = arrayLen;
printf( "程序运行后,出列人的顺序为:nn" );
for( i = 0; i < total; i++ ) /* 要打印total个人的情况,故做total次 */
{
if ( arrayLen == 1 )
printf( "%d", person[0] ); /* 如果是数组只剩一个元素,直接出列 */
else
{
deleNum = ( start + overNum - 1 ) % arrayLen; /* 此取模保证循环 */
printf( "%d ==> ", person[deleNum] );
for ( j = deleNum; j < arrayLen; j++ ) /* 将出列元素后面的各元素前移 */
person[j] = person[j+1];
start = deleNum;
arrayLen = arrayLen - 1; /* 移动完毕后,数组长度减1 */
}
}
printf( "nn" );
}

从一本数据结构书上看到的用向量实现此问题:
void Josephus (Vector &P, int n, int s, int m)
{
//将人员编号存入向量P;
int k = 1;
for(int i = 0; i=1; j--)
{
s1=(s1+m-1)%j;
if(s1== 0) s1 = j;
int w = P.Getnode(s1 - 1);
P.Remvoe(s1 - 1);
P.Insert(w,n-1);
}
}
数据结构算法题,合并两个链表的算法,计算时间复杂度。
数据结构算法题,合并两个链表的算法,计算时间复杂度。
已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。试写一算法将这两个链表连接在一起(即令其中一个表的首结点连在另一个表的最后一个结点之后),假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。请分析你的算法的时间复杂度。
bjmy741年前1
谁家扁舟 共回答了28个问题 | 采纳率78.6%
简单,比较m和n的大小,选择小的那个链表,找到它的尾节点,然后把另一个链表的头连接到这个链表的尾,最后把hc赋值为当前链表的头,返回即可。
时间复杂度是min(m,n)+c,c是常数。
求数据结构算法!急用!1、 约瑟夫环问题约瑟夫问题的描述是:编号为 1,2,----,n的n个人按顺时针方向围坐一圈,每
求数据结构算法!急用!
1、 约瑟夫环问题
约瑟夫问题的描述是:编号为 1,2,----,n的n个人按顺时针方向围坐一圈,
每人持有一个密码(正整数).一开始人选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数.报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止.试设计程序求出出列顺序.
基本要求:
利用单向循环链表存储结构模拟次过程,按照出列的顺序打印个人的编号.
2、 停车场管理
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出.汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出停车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用.试为停车场编制按上述要求进行管理的模拟程序.
基本要求:
以栈模拟停车场,以队列模拟车场外的便道.每一组输入的数据包括三个数据项:汽车“到达”或“离去”的信息、车牌号以及“到达”或“离去”的时刻(例如数据为(‘A’,1,5),其中A表示到达,D表示离去,E表示结束;1表示车牌号;5表示汽车停留的时间).对每一组输入数据进行操作后的输出信息为:若是汽车到达,则输出汽车在停车场内或便道上的停车位置:若是车辆离去,则输出汽车在停车场内停留的时间和应缴纳的费用(在便道上停留的时间不收费).
掌握线性结构在两种存储结构上对实际问题的基本操作.
小娘耔1年前1
无敌皮皮王子殿 共回答了12个问题 | 采纳率83.3%
数据结构主要研究组织大量数据的方法,而算法分析则是对算法运行时间的评估.随着计算机的速度越来越快,对于能够处理大量输入数据的程序的需求变得日益急切.可是,由于在输入量很大的时候,程序的低效率现象变得非常明显,因此这又要求对效率问题给予更仔细的关注.通过在实际编程之前对算法的分析,学生可以决定一个特定的解法是否可行.例如,学生在本书中将读到一些特定的问题并看到精心的实现方法是如何把对大量数据的时间限制从16年减至不到1秒的.因此,若无运行时间的阐释,就不会有算法和数据结构的提出.
我所选择的教材是《数据结构与算法分析——C语言描述》(原书第2版),英文版的名称是《Data Structures and Algorithm Analysis in C》,作者是:(美)Mark Allen Weiss.原书曾被评为20世纪顶尖的30部计算机著作之一.之所以选这本书,还因为它的简体中文版翻译得相当不错,几乎没有给我的阅读带来什么障碍.^_^
这本教科书所使用的是C语言,也许很多人会说C语言已经过时了,但是,我认为在数据结构的学习中,应该用尽量简单的语言,以免进入了语言的细枝末节中,反而冲淡了主题.实际上在国外的许多大学中(甚至中学),数据结构和算法分析的课程是选用Scheme的,例如MIT麻省理工大学极其著名的SICP课程.呵呵,语言又能说明什么呢?
书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能、效率以及对运行时间分析的基础上考查了一些高级数据结构,从历史的角度和近年的进展对数据结构的活跃领域进行了简要的概括.由于本书选材新颖,方法实用,题例丰富,取舍得当.本书的目的是培养学生良好的程序设计技巧和熟练的算法分析能力,使得他们能够开发出高效率的程序.从服务于实践又锻炼学生实际能力出发,书中提供了大部算法的C程序和伪码例程,但并不是全部.一些程序可从互联网上获得.
本书是《Data Structures and Algorithm Analysis in C》一书第2版的简体中译本.原书曾被评为20世纪顶尖的30部计算机著作之一,作者Mark Allen Weiss在数据结构和算法分析方面卓有建树,他的数据结构和算法分析的著作尤其畅销,并受到广泛好评.已被世界500余所大学用作教材.
在本书中,作者更加精炼并强化了他对算法和数据结构方面创新的处理方法.通过C程序的实现,着重阐述了抽象数据类型的概念,并对算法的效率、性能和运行时间进行了分析.
全书特点如下:
●专用一章来讨论算法设计技巧,包括贪婪算法、分治算法、动态规划、随机化算法以及回溯算法
●介绍了当前流行的论题和新的数据结构,如斐波那契堆、斜堆、二项队列、跳跃表和伸展树
●安排一章专门讨论摊还分析,考查书中介绍的一些高级数据结构
●新开辟一章讨论高级数据结构以及它们的实现,其中包括红黑树、自顶向下伸展树.treap树、k-d树、配对堆以及其他相关内容
●合并了堆排序平均情况分析的一些新结果
本书是国外数据结构与算法分析方面的标准教材,介绍了数据结构(大量数据的组织方法)以及算法分析(算法运行时间的估算).本书的编写目标是同时讲授好的程序设计和算法分析技巧,使读者可以开发出具有最高效率的程序. 本书可作为高级数据结构课程或研究生一年级算法分析课程的教材,使用本书需具有一些中级程序设计知识,还需要离散数学的一些背景知识.
数据结构算法 两线性表A,B求交集。。。请高手指点!!!
数据结构算法 两线性表A,B求交集。。。请高手指点!!!
已知按值递增有序排练的两个线性表A和B,且每个线性表内部各元素互不相同。试构造线性表C,使其是A和B的交集,且其中的数字同样按值递增排列。 要求: 1)分别采用顺序表、单链表、双链表三种数据结构存储上述线性表A、B、C 2)编写一个通用的程序(无论线性表A、B和C采用顺序表、单链表还是双链表存储,该程序完全通用),实现对线性表C的构造-Known to increase the value ordered by the two linear tables A rehearsal and B, and each of the elements within the linear table from each other. Linear table test structure C, it is the intersection of A and B, and the same number of them increasing order by value. Requirements: 1) were used to order table, a single list, double-linked list data structure stored in the linear three tables A, B, C 2) write a generic program (either the linear form A, B and C using the order form, a single list, or double-linked list storage, the program is completely general), to achieve the construction of the linear form C
flyinthewater1年前1
燕子翻飞 共回答了21个问题 | 采纳率95.2%
将A与B分别排序,然后求交。
例如:将A与B按升序排列,设A表头为P,B表头为Q,若A[P]>B[Q]那么Q++,若A[P]
求数据结构算法,急用!约瑟夫问题的描述是:编号为 1,2,----,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正
求数据结构算法,急用!
约瑟夫问题的描述是:编号为 1,2,----,n的n个人按顺时针方向围坐一圈,
每人持有一个密码(正整数).一开始人选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数.报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止.试设计程序求出出列顺序.
基本要求:
利用单向循环链表存储结构模拟次过程,按照出列的顺序打印个人的编号.
愚人心情1年前1
xjz1965 共回答了20个问题 | 采纳率85%
顶一下算了
数据结构算法题解答(2)\x05简述算法f22(T,k)的功能?Void f22(int A[],int n) {i=o
数据结构算法题解答
(2)x05简述算法f22(T,k)的功能?
Void f22(int A[],int n) {
i=o; j=n-1;
While( i
tianyinxue1年前1
jiang_p_j 共回答了23个问题 | 采纳率95.7%
把小于零的元素放在数组的右边.
把大于零的元素放在数组的左边.
数据结构算法求大神1 写一算法,统计出单链表L中结点的值等于给定值x的结点数。2 已知线性表中的元素(整数)以值递增有序
数据结构算法求大神
1 写一算法,统计出单链表L中结点的值等于给定值x的结点数。
2 已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表 中所有大于K1且小于K2的元素(若表中存在这样的元素,且K13假设两个按元素值递增有序排列的线性表A和B,均以单链表作为存储结构,请编写算法,将A表和B表 归并成一个按元素值递减有序的排列的线性表C,并要求利用原表(即A表和B表的)结点空间存放表C 。
79392341年前1
碧海银砂 共回答了17个问题 | 采纳率88.2%
#include
#include
#include
#include

#define elem int
#define M 10
typedef struct node
{
elem data;
struct node *next;
}no;

//以下单链表均带头节点
//1.
int f1(no *L,elem x)
{
int i=0;
L=L->next;
while(L)
{
if(L->data==x)
i++;
L=L->next;
}
return i;
}
//2.算法复杂度为O(N)
void f2(no *L,int k1,int k2)
{
if(k1>=k2)
{
coutnext;
}
while(L && L->datanext=L->next;
free(q);
L=p->next;
}
}
//3.算法采用的是头插法
node *f3(no *a,no *b)
{
if(!a || !b)
return 0;
node *c=new node,*p;
if(!c)
exit(1);
c->next=0;
while(a->next || b->next)
{
if(!a->next || b->next && b->next->data < a->next->data)
{//当链表a为空时,或b链表存在且b链表的第一个值小于a链表
p=b->next;
b->next=p->next;
}
else
{
p=a->next;
a->next=p->next;
}
p->next=c->next;
c->next=p;
}
return c;
}
数据结构 和算法关于数据结构算法的问题 根据下面的规则数列元素A[0],A[1].A[
数据结构 和算法关于数据结构算法的问题 根据下面的规则数列元素A[0],A[1].A[
数据结构 和算法关于数据结构算法的问题
根据下面的规则数列元素A[0],A[1].A[9] 存储整数 26 、43、63、24、85、
如果xmody对x被y取余数返回,数列的元素全部初期化为0.
规则
1、如果A[k mod 10] = 0则 k ->A[k mod 10]
2、 1不能存储时、如果A[(k + 1)mod 10]=0 则kー>A[(k + 1)mod 10]
3、 条件二不能存储时、如果A[(k + mod 10]=0则kー>A[(k + 4)mod 10]
配列
[0]__[1]__[2]__[3]__[4]__[5]__[6]__[7]__[8]__[9]__
isaackorea1年前1
31377777 共回答了16个问题 | 采纳率100%
这个是哈希冲突再散列的东西,26对10取余数是6,在6号空间,43在3号空间,63发生冲突,改为加一取余数,在4号空间.24的位置被63占了,同样冲突,于是加一取余数,到了5号空间.85以此类推,5号空间被占据了,加一取余数6号空间也被占了,于是变成加四取余数,在9号空间.于是
[0]__[1]__[2]__[3]_43_[4]_63_[5]_24_[6]_26_[7]__[8]__[9]_85_
其他空白数组元素都是零就不写了.
数据结构算法问题(两个)1.已知闭散列表的长度为10(散列地址空间为0..9),散列函数为H(k)=k%8,采用线性重新
数据结构算法问题(两个)
1.已知闭散列表的长度为10(散列地址空间为0..9),散列函数为H(k)=k%8,采用线性重新散列技术解决冲突.将下列一组数据{5,16,48,7,9,82,1,39}依次插入到散列表中,请画出插入这组数据后的散列表.
2.已知关键字序列(89,12,34,76,5,9,56),采用直接插入排序法按关键字递增(从小到大)排序,给出每一趟排序的结果.
sharpbat0011年前1
christapple 共回答了17个问题 | 采纳率94.1%
全是很基础的概念性东西,第一个线性重散列,再通过散列函数计算的位置已经有元素时,向后找到一个空位置放入即可,所以结果为:
地址 0 1 2 3 4 5 6 7 8 9
元素 16 48 9 82 1 5 7 39
第二个插入排序更没有什么了,这个你自己看就好了,每一次就是前几个元素的正确排序,比如
第一次:89
第二次:12,89
第三次:12,34,89
一次,到最后一次,为排好的有序数组
数据结构算法设计题1.已知一颗二叉树采用二叉链表存放,写一算法,要求统计出二叉树中叶子结点个数并输出(输出无顺序要求)1
数据结构算法设计题
1.已知一颗二叉树采用二叉链表存放,写一算法,要求统计出二叉树中叶子结点个数并输出(输出无顺序要求)
1.已知一个带头结点的整数单链表L,要求将其拆分为一个正整数单链表L1和一个负整数单链表L2.
2.无向图采用邻接表存储结构,编写算法输出图中各连通分量的节点序列
3.编写一个建立二叉树的算法,要求采用二叉链表存储结构
2.编写算法,判断带头结点的双循环链表L是否对称.
急需啊,考试要用的.
我知道有点麻烦啦,答案好的话我加分的
Yama_xx1年前1
500error 共回答了14个问题 | 采纳率100%
某链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用( )存储方式最节省运算时间.(A)...已知带头结点的单链表L中的结点是按整数值递增排列的,试写一算法,将值为x 的结点插入到表L中,使得L仍然有序
数据结构算法实现:利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合A=A并B.
数据结构算法实现:利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合A=A并B.
利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合A=A并B.
算法是
void union(List &La,List Lb){
La_len=ListLength(La);
Lb_len=ListLength(Lb);
for(i=1;i
22xiaomifeng1年前1
枯草天堂 共回答了19个问题 | 采纳率89.5%
#include
#include
#include
typedef int status;
typedef int ElemType;
#define TRUE 1
#define ERROR 0
#define FALSE 0
#define OK 1
#define OVERFLOW -2
#define list_init_size 100
#define listincrement 10
typedef struct{
x05ElemType *elem;
x05int length;
x05int listsize;
}sqlist;
status equal(ElemType a,ElemType b)
{if(a==b)
return TRUE;
else
return FALSE;
}
int listlength(sqlist l)
{ return l.length;}
status listinsert(sqlist *l,int i,ElemType e)
{
x05ElemType *newbase,*q,*p;
x05if(i(*l).length+1)
x05return ERROR;
x05if((*l).length>=(*l).listsize){
x05x05newbase=(ElemType*)realloc((*l).elem,((*l).listsize+listincrement)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
x05 (*l).elem=newbase;
x05 (*l).listsize+=listincrement;
}
q=&((*l).elem[i-1]);
for(p=&((*l).elem[(*l).length-1]);p>=q;--p)
x05 *(p+1)=*p;
*q=e;
++(*l).length;
return OK;
}
status initlist(sqlist *l){
x05(*l).elem=(ElemType*)malloc(list_init_size*sizeof(ElemType));
x05if(!(*l).elem)
x05x05exit(OVERFLOW);
x05(*l).length=0;
x05(*l).listsize=list_init_size;
x05return OK;
}
status getelem(sqlist l,int i,ElemType *e)
{ if(il.length)
exit(ERROR);
*e=*(l.elem+i-1);
return OK;
}
int LocateElem(sqlist L,ElemType e,status(*compare)(ElemType,ElemType))
{
ElemType *p;
int i=1;
p=L.elem;
while(i
数据结构算法问题已知Q是一个非空队列,S是一个空栈.仅仅用队列和栈的基本函数和少量工作变量,设计一个算法,将队列Q逆置,
数据结构算法问题
已知Q是一个非空队列,S是一个空栈.仅仅用队列和栈的基本函数和少量工作变量,设计一个算法,将队列Q逆置,(今晚刚看到的一个题,死活没头绪,求详细解答,非常感谢)
天山一枝梅1年前1
飘玲 共回答了18个问题 | 采纳率83.3%
将队列中元素按序取出并放入栈中,然后再逐一出栈并插入回队列中,就完成了逆置.