注意:现在偷的懒以后都要补回来的!
希望大家认真学好数据结构,不希望后悔!
- 递增顺序表插入
【问题描述】
设有递增有序顺序表,实现其插入元素后依然有序。
【输入形式】
第一行输入一个N(N不大于100);
第二行输入N个整数(假设输入序列按照递增顺序,以空格分隔);
第三行输入一个整数M(欲插入数据);
【输出形式】
输出插入M后的顺序表。
【样例输入】
5
12 25 35 98 125
77
【样例输出】
12 25 35 77 98 125
【评分标准】
功能实现要求写成算法函数形式,并利用顺序表基本操作。
数组
#include<stdio.h>
int main(){
int n,i,k,t;
scanf("%d",&n);
int sum[n];
for(i=0;i<n;i++){
scanf("%d",&sum[i]);
}
scanf("%d",&k);
if(k<=sum[n-1]){
for(i=0;i<n;i++){
if(k<=sum[i]){
t=i;
break;
}
}
for(i=n;i>=t;i--){
sum[i]=sum[i-1];
}
n++;
sum[t]=k;
}
else{
sum[n]=k;
n++;
}
for(i=0;i<n;i++){
printf("%d ",sum[i]);
}
}
结构体
#include <stdio.h>
#include <stdlib.h>
typedef struct List{
int *item;
int length;
}List;
int insertList(List *list,int n){
if (list->item[list->length-1]>=n){
for(int i=0;i<list->length;i++){
if(list->item[i] >= n){
for(int j=list->length-1;j>=i;j--){
list->item[j+1]=list->item[j];
}
list->item[i]=n;
list->length++;
break;
}
}
}else{
list->item[list->length]=n;
list->length++;
}
return 1;
}
int main()
{
int n,m;
List list,*li;
scanf("%d", &n);
list.item=(int *)malloc(sizeof(int)*(n+1));
list.length=0;
for(int i=0;i<n;i++){
scanf("%d",&list.item[i]);
list.length++;
}
scanf("%d",&m);
insertList(&list,m);
for(int i=0;i<list.length;i++){
printf("%d ",list.item[i]);
}
return 0;
}
- 顺序表删除重复元素
【问题描述】
设一顺序表有若干元素,编写程序实现删除表中值重复的元素,即重复元素只保留一个。
【输入形式】
第一行输入一个N(N不大于100),表示顺序表的长度;
第二行输入N个整数,表示顺序表元素;
【输出形式】
输出去重后的顺序表。
【样例输入】
7
2 2 2 3 3 2 2
【样例输出】
2 3
【评分标准】
功能实现要求写成算法函数形式,并利用顺序表基本操作。
#include <stdio.h>
#include <stdlib.h>
typedef struct List{
int *item;
int length;
}List;
int insertList(List *list){
for(int i=0;i<list->length;i++){
int a=list->item[i];
for(int j=1;j<list->length;j++){
if(a==list->item[j]){
list->item[j]=list->item[j+1];
list->length--;
}
}
}
return 1;
}
int main()
{
int n,m;
List list,*li;
scanf("%d", &n);
list.item=(int *)malloc(sizeof(int)*(n+1));
list.length=0;
for(int i=0;i<n;i++){
scanf("%d",&list.item[i]);
list.length++;
}
insertList(&list);
for(int i=0;i<list.length;i++){
printf("%d ",list.item[i]);
}
return 0;
}
- 建立带头结点的单链表
【问题描述】
设有头结点单链表,实现单链表建立算法。
【输入形式】
第一行输入一个N(N大于等于1,小于1000);
第二行输入N个整数,以空格作为分隔,创建长度为N的单链表。
【输出形式】
输出建立的单链表。
【样例输入1】
5
-4 5 2 7 0
【样例输出1】
-4 5 2 7 0
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node *next;
}Node;
int main()
{
int n;
Node *node,*head,*p,*q;
scanf("%d", &n);
head=(Node *)malloc(sizeof(Node));
head->next=NULL;
q=head;
for(int i=0;i<n;i++){
node=(Node *)malloc(sizeof(Node));
scanf("%d",&node->data);
q->next=node;
q=node;
}
q->next=NULL;
p=head->next;
do{
printf("%d ",p->data);
p=p->next;
}while(p!=NULL);
return 0;
}
- 单链表插入
【问题描述】
设有头结点单链表,实现单链表插入算法。
【输入形式】
第一行输入一个N(N大于等于1,小于1000);
第二行输入N个整数,以空格作为分隔,创建长度为N的单链表;
第三行输入pos和e,以空格分隔,分别表示插入位置和插入元素的值。
【输出形式】
若插入成功,输出插入元素后的单链表;若插入不成功,输出error。
【样例输入1】
5
-4 5 2 7 0
2 100
【样例输出1】
-4 100 5 2 7 0
【样例输入2】
5
1 2 3 4 5
8 8
【样例输出2】
error
【评分标准】
要求采用有头结点单链表作为存储结构,操作功能均以算法函数实现。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node *next;
}Node;
int main()
{
int n,pos,e,i=0;
Node *node,*head,*p,*q;
scanf("%d", &n);
head=(Node *)malloc(sizeof(Node));
head->next=NULL;
q=head;
for(int i=0;i<n;i++){
node=(Node *)malloc(sizeof(Node));
scanf("%d",&node->data);
q->next=node;
q=node;
}
q->next=NULL;
p=head;
scanf("%d %d",&pos,&e);
if(pos>0 && pos<=n){
do{
p=p->next;
i++;
if(i==pos){
p->data=e;
}
printf("%d ",p->data);
}while(p!=NULL);
}else{
printf("error");
}
return 0;
}