[NEFU锐格 数据结构]实验一 线性表有关的操作

Posted 鱼竿钓鱼干

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[NEFU锐格 数据结构]实验一 线性表有关的操作相关的知识,希望对你有一定的参考价值。

[NEFU锐格 数据结构]实验一 线性表有关的操作

主要是上学期链表的操作复习和进阶,书本是C语言版本的,然而书上代码是C++的,这属实很离谱。这次作业主要还是用了C语言的方式编写,以后直接写c++版本了(不过尽可能不用STL)。同时会在目录博客里发布C和C++的常见转化,方便各位理解书上的程序。平常建议直接创建cpp文件以防一些东西是c++的语法没法在c的文件中成功编译
[数据结构]NEFU 大二上 锐格实验参考 目录

知识点

题目知识点
8559数组翻转
8553单链表创建遍历
8554单链表翻转
8555插入维护有序单链表
8556单链表删除节点
8557有序单链表合并/单链表排序
8558单链表拆分
8560单链表实现多项式加法(本质是有序单链表创建和合并)

题目

很多题目是直接用了上题的代码所以不是所有函数都会被用到的,自己如果觉得代码太多了建议仔细看看调用了哪些函数。

8559

原地翻转数组存储的线性表,下面提供了一种交换的方法,当然你也可以直接逆序输出

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>

int arr[15];
int n;
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d",&arr[i]);
    for(int i=0;i<n;i++)printf("%d ",arr[i]);puts("");
    for(int i=0;i<n/2;i++){
        int tmp;
        tmp=arr[i];
        arr[i]=arr[n-i-1];
        arr[n-i-1]=tmp;
    }
    for(int i=0;i<n;i++)printf("%d ",arr[i]);puts("");
    return 0;
}

8553

创建和遍历有头节点的单链表,采用了尾插法

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdbool.h>

typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;//LNode 主要用于一般节点,*LinkList主要用于头节点

void CreatList_Tail(LinkList &L){
    L=(LNode *)malloc(sizeof (LNode));//等效于书上的new,不然要写c++
    L->next=NULL;
    LNode *r=L;//尾指针指向头节点
    LNode *p;
    int input;
    while(~scanf("%d",&input)){
        if(input==0)break;
        p=(LNode *)malloc(sizeof (LNode));
        p->data=input;
        p->next=NULL;
        r->next=p;
        r=p;
    }
}
void PrintList(LinkList &L){//打印链表
    LNode *p;
    p=L->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p=p->next;
    }
}
int main(){
    LinkList H;
    CreatList_Tail(H);
    PrintList(H);
    return 0;
}

8554

翻转单链表,只需要把指针指向翻转即可

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdbool.h>

typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;//LNode 主要用于一般节点,*LinkList主要用于头节点

void CreatList_Tail(LinkList &L){//后插法创建链表
    L=(LNode *)malloc(sizeof (LNode));//等效于书上的new,不然要写c++
    L->next=NULL;
    LNode *r=L;//尾指针指向头节点
    LNode *p;
    int input;
    while(~scanf("%d",&input)){
        if(input==0)break;
        p=(LNode *)malloc(sizeof (LNode));
        p->data=input;
        p->next=NULL;
        r->next=p;
        r=p;
    }
}
void PrintList(LinkList &L){//打印链表
    LNode *p;
    p=L->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p=p->next;
    }
}
void ReverseList(LinkList &L) {//反转链表
	if (L == NULL||L->next == NULL)return;

    LNode* pre = NULL; //前驱结点
    LNode* cur = L->next; //当前结点
    LNode* nex;  //后继结点
	while (cur!=NULL) {
        nex=cur->next;
        cur->next=pre;
        pre=cur;
        cur=nex;
    }
    L->next=pre;
}

int main(){
    LinkList H;
    CreatList_Tail(H);
    ReverseList(H);
    PrintList(H);
    return 0;
}

8555

插入维护有序链表

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdbool.h>

typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;//LNode 主要用于一般节点,*LinkList主要用于头节点

void CreatList_Tail(LinkList &L){//后插法创建链表
    L=(LNode *)malloc(sizeof (LNode));//等效于书上的new,不然要写c++
    L->next=NULL;
    LNode *r=L;//尾指针指向头节点
    LNode *p;
    int input;
    while(~scanf("%d",&input)){
        if(input==0)break;
        p=(LNode *)malloc(sizeof (LNode));
        p->data=input;
        p->next=NULL;
        r->next=p;
        r=p;
    }
}
void PrintList(LinkList &L){//打印链表
    LNode *p;
    p=L->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p=p->next;
    }
}
void ReverseList(LinkList &L) {//反转链表
	if (L == NULL||L->next == NULL)return;

    LNode* pre = NULL; //前驱结点
    LNode* cur = L->next; //当前结点
    LNode* nex;  //后继结点
	while (cur!=NULL) {
        nex=cur->next;
        cur->next=pre;
        pre=cur;
        cur=nex;
    }
    L->next=pre;
}

void InsertList(LinkList &L,int x){//插入维护有序链表
	LNode * p, * pre,* ins;
    ins=(LNode *)malloc(sizeof (LNode));
    pre=L;
    p=L->next;
    while(p!=NULL&&p->data<x){
        pre=p;
        p=p->next;
    }
    ins->data=x;
    ins->next=p;
    pre->next=ins;
} 

int main(){
    LinkList H;
    H=(LNode *)malloc(sizeof (LNode));//等效于书上的new,不然要写c++
    H->next=NULL;
    int x;
    while(~scanf("%d",&x)){
        if(x==0)break;
        InsertList(H,x);
    }
    PrintList(H);
    return 0;
}

8556

删除链表当中偶数点,当然你可以在创建链表的时候直接过滤掉偶数节点

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdbool.h>

typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;//LNode 主要用于一般节点,*LinkList主要用于头节点

void CreatList_Tail(LinkList &L){//后插法创建链表
    L=(LNode *)malloc(sizeof (LNode));//等效于书上的new,不然要写c++
    L->next=NULL;
    LNode *r=L;//尾指针指向头节点
    LNode *p;
    int input;
    while(~scanf("%d",&input)){
        if(input==0)break;
        p=(LNode *)malloc(sizeof (LNode));
        p->data=input;
        p->next=NULL;
        r->next=p;
        r=p;
    }
}
void PrintList(LinkList &L){//打印链表
    LNode *p;
    p=L->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p=p->next;
    }
}
void ReverseList(LinkList &L) {//反转链表
	if (L == NULL||L->next == NULL)return;

    LNode* pre = NULL; //前驱结点
    LNode* cur = L->next; //当前结点
    LNode* nex;  //后继结点
	while (cur!=NULL) {
        nex=cur->next;
        cur->next=pre;
        pre=cur;
        cur=nex;
    }
    L->next=pre;
}

void InsertList(LinkList &L,int x){//插入维护有序链表
	LNode * p, * pre,* ins;
    ins=(LNode *)malloc(sizeof (LNode));
    pre=L;
    p=L->next;
    while(p!=NULL&&p->data<x){
        pre=p;
        p=p->next;
    }
    ins->data=x;
    ins->next=p;
    pre->next=ins;
} 

void DeleteList(LinkList &L) {//删除符合某个条件的节点
    LNode * p,* pre,*tmp;
    pre=L;p=L->next;
    while(p!=NULL){
        if(p->data%2==0){//if里写删除规则
            tmp=p;//直接用p释放后影响后续循环
            pre->next=p->next;
            p=p->next;//pre不用更新,p更新为下一个节点
            free(tmp);//释放
        }
        else{
            pre=p;
            p=p->next;
        }
    }
}
int main(){
    LinkList H;
    CreatList_Tail(H);
    DeleteList(H);
    PrintList(H);
    return 0;
}

8557

创建两个有序链表,然后合并成一个有序链表。我是先合并然后直接写了链表排序的,如果想要先创建两个有序链表然后在合并可以参看最后那道多项式的代码。

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdbool.h>

typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;//LNode 主要用于一般节点,*LinkList主要用于头节点

void CreatList_Tail(LinkList &L){//后插法创建链表
    L=(LNode *)malloc(sizeof (LNode));//等效于书上的new,不然要写c++
    L->next=NULL;
    LNode *r=L;//尾指针指向头节点
    LNode *p;
    int input;
    while(~scanf("%d",&input)){
        if(input==0)break;
        p=(LNode *)malloc(sizeof (LNode));
        p->data=input;
        p->next=NULL;
        r->next=p;
        r=p;
    }
}
void PrintList(LinkList &L){//打印链表
    LNode *p;
    p=L->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p=p->next;
    }
}
void ReverseList(LinkList &L) {//反转链表
	if (L == NULL||L->next == NULL)return;

    LNode* pre = NULL; //前驱结点
    LNode* cur = L->next; //当前结点
    LNode* nex;  //后继结点
	while (cur!=NULL) {
        nex=cur->next;
        cur->next=pre;
        pre=cur;
        cur=nex;
    }
    L->next=pre;
}

void InsertList(LinkList &L,int x){//插入维护有序链表
	LNode * p, * pre,* ins;
    ins=(LNode *)malloc(sizeof (LNode));
    pre=L;
    p=L->next;
    while(p!=NULL&&p->data<x){
        pre=p;
        p=p->next;
    }
    ins->data=x;
    ins->next=p;
    pre->next=ins;
} 

void DeleteList(LinkList &L) {//删除符合某个条件的节点
    LNode * p,* pre,*tmp;
    pre=L;p=L->next;
    while(p!=NULL)[NEFU锐格 数据结构]实验五六 图有关的操作

[NEFU锐格 数据结构]实验二 栈和队列有关的操作

[NEFU锐格 数据结构]实验七 查找有关的操作

[NEFU锐格 数据结构]实验三四 二叉树常见的操作

[JAVA] NEFU 大二下锐格 目录

[NEFU 数据结构] 第 2 章 线性表 知识点整理