数据结构上机测试1:顺序表的应用
Time Limit: 1000MS Memory limit: 65536K
数据结构上机测试1:顺序表的应用
Time Limit: 1000MS Memory limit: 65536K
题目描述
在长度为n(n<1000)的顺序表中可能存在着一些值相同的“多余”数据元素(类型为整型),编写一个程序将“多余”的数据元素从顺序表中删除,使该表由一个“非纯表”(值相同的元素在表中可能有多个)变成一个“纯表”(值相同的元素在表中只能有一个)。
输入
第一行输入表的长度n;
第二行依次输入顺序表初始存放的n个元素值。
输出
第一行输出完成多余元素删除以后顺序表的元素个数;
第二行依次输出完成删除后的顺序表元素。
示例输入
125 2 5 3 3 4 2 5 7 5 4 3
示例输出
5
5 2 3 4 7
解题报告
#include<stdio.h>
#include<stdlib.h>
struct node{
int n;
struct node *next;
}*head,*tail,*l;
int main()
{
head=new node;
head->next=NULL;
int n,i,a,m=0;
scanf("%d",&n);
node *p=head;
for(i=0;i<n;i++)
{
node *q=new node;
scanf("%d",&q->n);
q->next=NULL;
p->next=q;
p=q;
m++;
}
node *q=head->next,*l,*r;
while(q!=NULL)
{
a=q->n;
r=q;
l=r->next;
while(l!=NULL)
{
if(l->n==a)
{
r->next=l->next;
free(l);
l=r->next;
m--;
}
else
{
r=l;
l=l->next;
}
}
q=q->next;
}
printf("%d\n",m);
for(node *q=head->next;q!=NULL;q=q->next)
{
printf("%d ",q->n);
}
}
/**************************************
Problem id : SDUT OJ A
User name : acm2013叶思俊
Result : Accepted
Take Memory : 284K
Take Time : 0MS
Submit Time : 2014-01-15 10:25:54
**************************************/
数据结构上机测试2-1:单链表操作A
Time Limit: 1000MS Memory limit: 4096K
题目描述
输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除。分别输出建立的初始单链表和完成删除后的单链表。
输入
第一行输入数据个数n;
第二行依次输入n个整数;
第三行输入欲删除数据m。
第二行依次输入n个整数;
第三行输入欲删除数据m。
输出
第一行输出原始单链表的长度;
第二行依次输出原始单链表的数据;
第三行输出完成删除后的单链表长度;
第四行依次输出完成删除后的单链表数据。
第二行依次输出原始单链表的数据;
第三行输出完成删除后的单链表长度;
第四行依次输出完成删除后的单链表数据。
示例输入
10 56 25 12 33 66 54 7 12 33 12 12
示例输出
10 56 25 12 33 66 54 7 12 33 12 7 56 25 33 66 54 7 33
- 解题报告
- 关于链表的删除。。。
#include<stdio.h> #include<stdlib.h> struct node{ int date; struct node *next; }; int main() { int i,n,m; node *head=new node; head->next=NULL; node *tail; tail=head; scanf("%d",&n); for(i=0;i<n;i++) { node *p=new node; scanf("%d",&p->date); p->next=NULL; tail->next=p; tail=p; } scanf("%d",&m); node *p,*q; p=head; printf("%d\n",n); printf("%d",p->next->date); while(p->next->next!=NULL) { printf(" %d",p->next->next->date); p=p->next; } p=head; while(p->next!=NULL) { q=p->next; if(p->next->date==m) { p->next=q->next; free(q); n--; } else p=p->next; } p=head; printf("\n%d\n",n); printf("%d",p->next->date); while(p->next->next!=NULL) { printf(" %d",p->next->next->date); p=p->next; } } /************************************** Problem id : SDUT OJ M User name : acm2013叶思俊 Result : Accepted Take Memory : 288K Take Time : 0MS Submit Time : 2014-01-15 13:49:15 **************************************/
删除功能的实现主要要有两个指针来控制。一个遍历所有数的指针,一个前置指针。实现如下:
while(p->next!=NULL) { q=p->next; if(p->next->date==m) { p->next=q->next; free(q); n--; } else p=p->next; }
由于需要遍历所有数,所以建立顺序链表的方式要注意有一个空头。。。
数据结构上机测试2-2:单链表操作B
Time Limit: 1000MS Memory limit: 65536K
题目描述
按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。
输入
第一行输入元素个数n;
第二行输入n个整数。
输出
第一行输出初始链表元素个数;
第二行输出按照逆位序所建立的初始链表;
第三行输出删除重复元素后的单链表元素个数;
第四行输出删除重复元素后的单链表。
示例输入
10
21 30 14 55 32 63 11 30 55 30
示例输出
10
30 55 30 11 63 32 55 14 30 21
7
55 11 63 32 14 21
3
0
数据结构上机测试2-2:单链表操作B
Time Limit: 1000MS Memory limit: 65536K
题目描述
按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。
输入
第一行输入元素个数n;
第二行输入n个整数。
输出
第一行输出初始链表元素个数;
第二行输出按照逆位序所建立的初始链表;
第三行输出删除重复元素后的单链表元素个数;
第四行输出删除重复元素后的单链表。
示例输入
10
21 30 14 55 32 63 11 30 55 30
示例输出
10
30 55 30 11 63 32 55 14 30 21
7
55 11 63 32 14 21
3
0
数据结构上机测试2-2:单链表操作B
Time Limit: 1000MS Memory limit: 65536K
数据结构上机测试2-2:单链表操作B
Time Limit: 1000MS Memory limit: 65536K
题目描述
按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。
输入
第一行输入元素个数n;
第二行输入n个整数。
输出
第一行输出初始链表元素个数;
第二行输出按照逆位序所建立的初始链表;
第三行输出删除重复元素后的单链表元素个数;
第四行输出删除重复元素后的单链表。
示例输入
1021 30 14 55 32 63 11 30 55 30
示例输出
1030 55 30 11 63 32 55 14 30 21755 11 63 32 14 2130
- 解题报告
- 也同样是删除操作。。。
#include<stdio.h> #include<stdlib.h> struct node { int date; struct node *next; }; int main() { int n,i; node *head=NULL; scanf("%d",&n); for(i=0;i<n;i++) { node *p=new node; scanf("%d",&p->date); p->next=head; head=p; } node *p,*r,*q; printf("%d\n",n); p=head; printf("%d",p->date); while(p->next!=NULL) { printf(" %d",p->next->date); p=p->next; } p=head; while(p!=NULL) { r=p; q=r->next; while(q!=NULL) { if(q->date==p->date) { r->next=q->next; free(q); q=r->next; n--; } else { r=r->next; q=q->next; } } p=p->next; } printf("\n%d\n",n); p=head; printf("%d",p->date); while(p->next!=NULL) { printf(" %d",p->next->date); p=p->next; } } /************************************** Problem id : SDUT OJ L User name : acm2013叶思俊 Result : Accepted Take Memory : 288K Take Time : 0MS Submit Time : 2014-01-15 14:30:12 **************************************/
不一样的是要三个指针,一个遍历指针,一个游动指针,一个前置指针。。。
p=head; while(p!=NULL) { r=p; q=r->next; while(q!=NULL) { if(q->date==p->date) { r->next=q->next; free(q); q=r->next; n--; } else { r=r->next; q=q->next; } } p=p->next; }
双向链表的建表:
struct node { int date; node *next; node *pre; };
for(i=0;i<n;i++) { node *p=new node; scanf("%d",&p->date); p->pre=NULL; p->next=head; if(head)//如果头指针不为空,逆向链接 { head->pre=p; } head=p; }