0.PTA得分截图

1.本周内容总结

1.1总结线性表内容

  • 顺序表结构体定义
typedef struct LNode *List
struct LNode
{
ElementType Data[MAXSIZE];
int last;
};
struct LNode L;
List PtrL;
  • 顺序表插入
void Insert(ElementType X, int i; List PtrL)
{
int j;
if (PtrL->Last == MAXSIZE - 1)
{
cout << "表满"<<endl;
return;
}
if (i < 1 || i> PtrL->Last + 2)
{
cout << "位置不合法" << endl;
return;
}
for (j = PtrL->Last; j >= i - 1; j--)
{
PtrL->Data[j + 1] = PtrL->Data[j];
}
PtrL->Data[i - 1] = X;
PtrL->Last++;
return;
}
  • 顺序表删除
void Delete(int i, List PtrL)
{
int j;
if (i<1 || i>PtrL->Last + 1)
{
cout << "不存在第" << i << "个元素" << endl;
return;
}
for (j = i; j <= PtrL->Last; j++)
{
PtrL->Data[j - 1] = PtrL->Data[j];
}
PtrL->Last--;
return;
}
  • 链表结构体定义
typedef struct LNode  		//定义单链表结点类型
{
ElemType data;
struct LNode* next; //指向后继结点
} LNode, * LinkList;
  • 链表头插法及尾插法
List Insert(ElementType X, int i, List PtrL)
{
List p, s;
if (i == 1)/*新结点插入在表头*/
{
s == new LNode;/*申请、填装结点*/
s->Data = x;
s->Next = PtrL;
return s;/*返回新表头指针*/
}
p = FindKth(i - 1, PtrL);/*查找第i-1个结点*/
if (p == NULL)/*第i-1个不存在,不能插入*/
{
cout << "参数i错" << endl;
return NULL;
}
else
{
s = new LNode;/*申请、填装结点*/
s->Data = X;
s->Next = p->Next;/*新结点插入在第i-1个结点的后面*/
p->Next = s;
return PtrL;
}
}
  • 链表删除
List Delete(int i, List PtrL)
{
List p, s;
if (i == 1)/*若要删除的是第一个结点*/
{
s = PtrL;/*s指向第一个结点*/
if (PtrL != NULL)
{
PtrL = PtrL->Next;/*从链表中删除*/
}
else
{
return NULL;
}
delete s;/*释放被删除结点*/
return PtrL;
}
p = FindKth(i - 1, PtrL);/*查找第i-1个结点*/
if (p == NULL)
{
cout << "第" << i - 1 << "个结点不存在" << endl;
return NULL;
}
else if(p->Next==NULL)
{
cout << "第" << i << "个结点不存在" << endl;
return NULL;
}
else
{
s = p->Next;/*s指向第i个结点*/
p->Next = s->Next;/*从链表中删除*/
delete s;/*释放被删除结点*/
return PtrL;
}
  • 链表插入
bool ListInsert(LinkList& L, int i, ElemType e)
{
int j = 0;
LinkList p = L;//p指向头结点,j为0
while (j < i - 1 && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL)//未找到第i-1个节点
return false;
else
{
LinkList s;
s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
}
  • 有序链表的插入
void ListInsert(LinkList& L, ElemType e)
{
LinkList pre = L, p;
while (pre->next != NULL && pre->next->data < e)
{
pre = pre->next;
}
p = new LNode;
p->data = e;
p->next = pre->next;
pre->next = p;
}
  • 有序链表的删除
void ListDelete(LinkList& L, ElemType e)
{
LinkList p = L, s,j=L;
int flag = 0;
int cnt = 0;
while (p->next != NULL )
{
if (p->next->data == e)
{
flag = 1;
s = p->next;
p->next = p->next->next;
delete s;
}
else
{
p = p->next;
}
}
while (j->next != NULL)
{
cnt++;
j = j->next;
}
if (flag == 0&&cnt!=0)
{
cout << e << "找不到!" << endl;
} }
  • 有序链表的归并
void UnionList(LinkList L1, LinkList L2, LinkList L3)
{
LinkList p1 = L1->next, p2 = L2->next, r, s;
L3 = new LNode;
r = L3;
while (p1 != NULL && p2 != NULL)
{
if (p1->data < p2->data)
{
s = new LNode;
s->data = p1->data;
r->next = s;
r = s;
p1 = p1->next;
}
else
{
s = new LNode;
s->data = p2->data;
r->next = s;
r = s;
p2 = p2->next;
}
}
while (p1 != NULL)
{
s = new LNode;
s->data = p1->data;
r->next = s;
r = s;
p1 = p1->next;
}
while (p2 != NULL)
{
s = new LNode;
s->data = p2->data;
r->next = s;
r = s;
p2 = p2->next;
}
r->next = NULL;
}
  • 双链表定义
typedef struct DNode
{
ElemType data;
struct DNode* prior;//指向前驱节点
struct DNode* next;//指向后继节点
}DNode, * Dlist;
  • 双链表节点的插入片段
s->next=p->next;
p->next=s;
s->next->prior=s;
s->prior=p;
  • 双链表节点的删除片段
q=p->next;
p->next=p->next->next;
q->next->prior=p;
delete p;

1.2对线性表的认识及学习体会

  • 线性表是点对点的一个逻辑结构
  • 线性表(数据结构)所需要掌握的基本操作多,需多加练习才能达到要求
  • 线性表是数据结构之后学习的基础,应加以重视并多多练习

2.PTA实验作业

2.1题目1:两个有序序列的中位数

2.1.1代码截图











2.1.2本题PTA提交列表说明

  • Q1:段错误

    • A1:

      尾指针r一开始没有指向表头L3所导致
  • Q2:部分正确
    • A2:

      通过注释排查,问题出在链表合并这一函数的实现上。

      把合并还没合并完链表的代码错写在了合并两链表共有长度的片段上,导致出错。

2.2题目2:jmu-ds-有序链表的插入删除

2.2.1代码截图



2.2.2本题PTA提交列表说明

  • Q1:部分正确得5分

    • A1:没看清题目要求,没编辑相应的代码

  • Q2:部分正确得10分
    • A2:

      此代码为最终代码,在VS上的结果是:



      没有头绪。

2.3题目3: jmu-ds-有序表插入数据

2.3.1代码截图



2.3.2PTA提交列表说明

  • Q1:部分正确得10分

    • A1:插入函数中,寻找插入位置用for循环,导致考虑数组溢出问题,难以完成代码要求。故,改用while循环查找插入位置。



  • Q2:部分正确得15分

    • A2:未编辑空表需输出error的代码导致空表的测试点过不去
  • Q3:部分正确得20分

    • A3:查找插入位置的代码不严谨,在插入最后一个出现问题。因为顺序表用数组来实现,而没有读入数据的数组位置的数据随机,因此需完善代码。



3.阅读代码

3.1题目及解题代码



3.1.1该题的设计思路









3.1.2该题的伪代码

if (表A或表B为空表) return NULL;
定义链表指针pA指向表A,pB指向表B;
while (pA的值与pB的值不相等)
{
if (pA的值为NULL)
pA = headB;
else
pA = pA->next;
if (pB的值为NULL)
pA = headA;
else
pB = pB->next;
}
return pA;

3.1.3运行结果



3.1.4解题优势及难点

  • 难点

    • 怎么样构思找到相交的点
    • 是地址也要相同还是只有数据相同
  • 解题优势
    • 从具有相同长度入手,并遍历表后使其指向另一个表从而解决长度差的问题

      • 否则需考虑两表谁长谁短而进行分类,加大代码量
    • 运用了三目运算符,压缩了代码量,使得代码更为简洁

最新文章

  1. block,inline,inline-block的区别
  2. 【C语言入门教程】7.2 结构体数组的定义和引用
  3. malloc/free与new/delete的区别
  4. 美行Thinkpad八通道快捷入口
  5. scrum1.4---Sprint 计划
  6. archlinux 网络配置
  7. 利用Comparator排序
  8. Git &amp; Github 一页简明笔记(转)main
  9. java项目(java project)如何导入jar包的解决方案列表
  10. 七.HTTP协议原理介绍
  11. wget -r -c -nd
  12. AX_UserInfo
  13. The Unique MST POJ - 1679 (次小生成树)
  14. 以太坊abi
  15. oracle 变量练习
  16. JavaScript , js 上下文(this 的指代)
  17. 深入理解ASP.NET MVC(5)
  18. linux分享一:网络设置
  19. Asp.net自定义控件系列(一)
  20. MongoDB的数据类型(四)

热门文章

  1. windows下的tfjs-node安装异常总结
  2. python djangjo 文件上传
  3. DP &#215; KMP
  4. 吴裕雄--python学习笔记:sqlite3 模块
  5. 吴裕雄--天生自然python编程:实例(2)
  6. spring整合ehcache实现缓存
  7. IT培训的背后,是“韭菜”的躺赚梦!
  8. 使用 JavaScript 创建并下载文件
  9. runR
  10. plsql-工具安装部署及使用配置