[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锐格 数据结构]实验五六 图有关的操作