C语言数据结构-1(顺序表删除重复元素、建立单链表、插入元素)

注意:现在偷的懒以后都要补回来的!

希望大家认真学好数据结构,不希望后悔!

  1. 递增顺序表插入
    【问题描述】
    设有递增有序顺序表,实现其插入元素后依然有序。
    【输入形式】
    第一行输入一个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;
}

  1. 顺序表删除重复元素
    【问题描述】
    设一顺序表有若干元素,编写程序实现删除表中值重复的元素,即重复元素只保留一个。
    【输入形式】
    第一行输入一个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;
}
  1. 建立带头结点的单链表
    【问题描述】
    设有头结点单链表,实现单链表建立算法。
    【输入形式】
    第一行输入一个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;
}
  1. 单链表插入
    【问题描述】
    设有头结点单链表,实现单链表插入算法。
    【输入形式】
    第一行输入一个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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂人开飞机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值