第02次作业——线性表

  

6-3 jmu-ds- 顺序表删除重复元素

设计一个算法,从顺序表中删除重复的元素,并使剩余元素间的相对次序保存不变。

输入格式: 第一行输入顺序表长度。 第二行输入顺序表数据元素。中间空格隔开。

输出格式:数据之间空格隔开,最后一项尾部不带空格。

输出删除重复元素后的顺序表。

{

    数据对象:a[ ]

    数据关系:L={data  [ i ] | 0<i<length, data [ i ] 为顺序表中的数,length为顺序表的长度}

   基本运算:

void CreateSqList(List &L,int a[],int n): 创建顺序表L将数组中的元素传入线性表中
void DispSqList(List L):输出顺序表从第一位开始,输出线性表
void DelSameNode(List &L):删除顺序表重复元素
}
设计思路:
1,创建顺序表
2,输出修改过的顺序表
2,删除相同元素部分:
利用for循环,将顺序表的第一位依次和顺序表的下一位进行比较
for(i=0;i<L->length-1;i++)  for(j=i+1;j<L->length;j++)
,如果相等则从相等的位置起,后面的元素依次向前移动一位,
 if(L->data[i]==L->data[j])顺序表长度减少1 L->length--,移动后的位置依次和前面的一位进行比较。
  
代码:

void CreateSqList(List &L,int a[],int n)//创建顺序表

{
int i;
L=new SqList;
for(i=0;i<n;i++)
L->data[i]=a[i];
L->length=n;
}
void DispSqList(List L)//输出线性表
{
int i;
for(i=0;i<L->length;i++)
{
if(i!=0)
cout<<" ";
cout<<L->data[i];
}
}
void DelSameNode(List &L)//删除相同元素
{
   int i,j,k;
   for(i=0;i<L->length-1;i++)
{
   for(j=i+1;j<L->length;j++)
   if(L->data[i]==L->data[j])
   {
   for(k=j;k<L->length-1;k++)//如果相当等后面所有的数先前移动一位
   L->data[k]=L->data[k+1];
    L->length--;//长度减一
      j--;//移位后新的j所在位置的数再进行和i位置的进行比较,所以j一定要--不然的话运行不对
     }
 }
}

调试:
1,不全部重复

2.全部都重复

6-3 jmu-ds-链表倒数第m个数

已知一个带有表头节点的单链表,查找链表中倒数第m个位置上的节点。

输入要求:先输入链表结点个数,再输入链表数据,再输入m表示倒数第m个位置。

输出要求,若能找到则输出相应位置,要是输入无效位置,则输出-1

{

   数据对象:L

   数据关系:p=L,s=L (p,s的使用使运算方便

  基本运算:

  int Find(LinkList L, int m ):查找倒数第m个数

}

设计思路:

1.用n 记录链表节点的个数

2.判断m是否越界

3.j=n-m记录m的正数位置并输出m

代码:

int Find(LinkList L, int m )
{
int i=0,n=0,j,e;
LinkList p=L;
while(p->next!=NULL)
{
n++;
p=p->next;
}
if(m>n||m<=0)//越界输出
{
return -1;
}
else
{
j=n-m;
LinkList s=L;//行定义指针,之前定义的现在指的位置为链表最后一个,不可以用了
while(i<=j&&s->next!=NULL)
{
i++;
s=s->next;
}
e=s->data;
}
return e;
}

运行:

 

7-1 两个有序链表序列的合并

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的并集新非降序链表S3。

{

  数据对象:L(a),L(b)

  数据关系:L(c)={L(a)∪L(b)}

  基本运算:LinkList a, b, c;

                   InitL(a);:创建头指针

                    InitL(b);

                   InitL(c);
                   ListCreateL(a);:创建链表

                  ListCreateL(b);

                 MergeListL(c, a, b);:合并链表
                 ListPrintL(c);

}

 设计思路:

1.创建链表

2.合并链表:比较两个链表中的元素的大小,谁的元素小C的指针就指向谁,并且将谁的元素输入指针中。

代码:

void MergeListL(LinkList &c, LinkList &a, LinkList &b)//合并链表
{
c = a;
LNode *aa = a->next;
LNode *bb = b->next;
LNode *cc = c;
while(bb&&aa)
{
if(aa->data > bb->data)
{
cc->next = bb;
cc = bb;
bb = bb->next;
}
else
{
cc->next = aa;
cc = aa;
aa = aa->next;
}
}
if(aa)
{
cc->next = aa;
}
else
cc->next = bb;
}

运行:

1.

一般情况

2.链表为空

二、截图本周题目集的PTA最后排名

我的排名:65

我的总分:95

评价:1分;

三、本周学习总结

1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?

我一般都是上完课后回来在看一下,讲过的,空闲的 时候用来写作业,没有固定的写作业时间,我对自己不满意,因为好多代码都不会,尤其是 编程题都是问同学,

我打算自己多思考,不会的再多想想,不要泛滥自己的依赖思想

2.谈谈你对线性表的认识?

我觉得线性表操作比较方便,尤其是在插入和删除上比顺序表 好的太多,感觉空间复杂度,和时间复杂度都比较的低

3.代码Git提交记录截图。

 

 

posted @ 2018-03-24 20:31  gammerlmlh  阅读(639)  评论(5编辑  收藏  举报