数据结构作业两道

作业1:已知长度为N的线性表A采用顺序存储结构,请写出一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法可删除线性表中所有值为item的数据元素。具体要求:编写... 作业1:已知长度为N的线性表A采用顺序存储结构,请写出一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法可删除线性表中所有值为item的数据元素。

具体要求:编写一个函数实现题目的要求,数据元素的类型设为int,函数可以设为
void DeleteItem(SqList&L, int item)
注意item可能在顺序表中出现多次,要求一次循环删除所有的item,每个数据元素被移动的次数至多一次。

作业2:设计一个算法,通过一趟遍历,将链表中所有结点的链接方向逆转,且仍利用原表的存储空间。
具体要求:编写一个函数实现题目的要求,函数可以设为
void InverseList(LinkList L)
链表逆转后,头指针保持不变,头结点的指针指向原链表最后一个结点,该结点的指针指向原链表倒数第二个结点,依次类推,原首元结点的指针为空指针。
注意通用性,即使原链表为空表,程序也要能正确运行。
展开
 我来答
wangkafeng
推荐于2017-09-26 · 知道合伙人数码行家
wangkafeng
知道合伙人数码行家
采纳数:964 获赞数:4668
深圳清华大学研究院助理研究员 中国科学院深圳先进技术研究院算法工程师、博士。

向TA提问 私信TA
展开全部

作业一代码如下:

#include <stdlib.h>

#include <iostream>

using namespace std;


#define LIST_INIT_SIZE 100 //定义顺序表中元素个数最多有几个

#define LISTINCREMENT 10


typedef struct SqList{

int *elem; //elementtype是元素的类型 依具体情况而定

int length; // 当前长度

int listsize; // 当前分配的存储容量

}SqList; 


void DeleteItem(SqList &L, int item);

void AddItem(SqList &L, int item);

void InitList(SqList &L);


SqList list;


void main()

{

int data;

int i = 0;

int *p;


InitList(list);


cout << "input data : " << endl;

for (i=0; i<10; i++)

{

cin >> data;

AddItem(list, data);

}


for (i=0; i<list.length; i++)

{

//p = &list.elem[i];

cout << list.elem[i] << " ";

}

cout << endl;


DeleteItem(list, 2);


for (i=0; i<list.length; i++)

{

//p = &list.elem[i];

cout << list.elem[i] << " ";

}

cout << endl;


}


void InitList(SqList &L)

{

L.elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));

if (!L.elem)

return;


L.length = 0;

L.listsize = LIST_INIT_SIZE;

return ;

}


void AddItem(SqList &L, int item)

{

/*

int *q;

q = &L.elem[L.length];

*q = item;

*/

L.elem[L.length] = item;

++L.length;

}


void DeleteItem(SqList &L, int item)

{

int i = 0;

int j = 0;

int first = 0; // 第一个被删除元素位置

int second = 0; // 第二个被删除元素位置

int count = 0; // 总共有几个

// 先标记出位置,然后再移动后面的元素


for (i = 0; i < L.length; i++)

{

if (L.elem[i] == item && !first)

{

count++;

first = i;

if (i == L.length) // 只有一个数并且在最末尾的情况。

{

L.elem[L.length] = 0;

L.length--;

return;

}

else

{

continue;

}

}


// 中间数据的移动

if (!second && (first != second) && L.elem[i] == item) // 当最少有2个数字

{

second = i;

// 

for (j = first - count + 1; j < second; j++)

{

L.elem[j] = L.elem[j+count];

}

first = second;

second = 0;


count++;

}


// 当只有最后一个数需要移动

if (first > 0 && second == 0 && i == L.length - 1)

{

// 

for (j = first - count + 1; j < L.length; j++)

{

L.elem[j] = L.elem[j+count];

}

}

}


L.length = L.length - count;

}


// 默认删除数字2,可以修改输入删除其他数字。

作业二,源代码:

//#include "stdafx.h"

#include <stdlib.h>

#include <iostream>

using namespace std;


typedef struct NODE {

int data;

struct NODE *next;

} LinkList;



LinkList *pHeadLa;


void InverseList(LinkList *L);

void InputData(LinkList * pHead);

void OutputData(LinkList * pHead);


void main()

{

pHeadLa = (LinkList *)malloc(sizeof(LinkList));

pHeadLa->data = 0;

pHeadLa->next = NULL;


cout << "Input data, please!" << endl;

InputData(pHeadLa);

OutputData(pHeadLa);

InverseList(pHeadLa);

OutputData(pHeadLa);

}


// 输入链表存储

void InputData(LinkList * pHead)

{

int count = 10;

LinkList *p = pHead;


while(count-- > 0)

{

p->next = (LinkList *)malloc(sizeof(LinkList));

cin >> p->next->data;

p->next->next = NULL;

p = p->next;

}

}


void OutputData(LinkList * pHead)

{

LinkList *p = pHead;

while(p->next)

{

cout << p->next->data << " ";

p = p->next;

}

cout << endl;

}


void InverseList(LinkList *L)

{

LinkList *p = L;

LinkList *p1;

LinkList *p2;

LinkList *p3;


// 空表 或者 只有一个节点

if (L->next == NULL || L->next->next == NULL)

{

return;

}


p1 = p->next;

p2 = p->next->next;

p3 = p->next->next->next;


// 有2个节点

if (p->next->next->next == NULL)

{

p->next = p2;

p2->next = p1;

p1->next = NULL;

}

// 最少有3个节点

while(1)

{

p2->next = p1;

if (p1 == L->next) // P1第一个节点

{

p1->next = NULL;

}


if (p3->next) // 未到达末尾点

{

p = p1;

p1 = p2;

p2 = p3;

p3 = p3->next;

}

else // 到达末尾点

{

p3->next = p2;

L->next = p3;

break;

}

}

}

运行结果:

追问
迟到了,点赞!
创远信科
2024-07-24 广告
材料测试数据库是我们公司精心构建的核心资源之一,它集成了丰富的材料测试数据,涵盖了从基础物理性能到高级化学特性的全方位信息。这一数据库不仅为研发人员提供了宝贵的数据支持,也助力了新材料开发和技术创新。我们持续更新数据库内容,确保数据的准确性... 点击进入详情页
本回答由创远信科提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式