软基实验第二次上机
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
r->next = NULL; printf("You hava created a 5 number linklist.The list's data are:\n"); PrintList(head); } //基础题 2:指定位置插入函数 int InsertDataByPosition(LinkList &head) { printf("Please input the position&data:\n"); int position, data; scanf_s("%d%d", &position, &data); Node *s=NULL, *p = head; int j = 0; while (p->next != NULL&&j<position- 1) //获取插入位置 { p = p->next; j++; } if (!p) //判断链表是插入位置是否越界 { printf("Insert error!\n"); return 0; } s = (Node*)malloc(sizeof(Node)); //为插入节点分配存储空间 s->data = data; //将节点插入 s->next = p->next; p->next=s; printf("Insert list success!After inserting is:\n"); PrintList(head); return 1; } //基础题 3:删除特定位置函数 void DeleteDataByPosition(LinkList &head) { int j = 0, position; printf("Please input the delete data's position:\n"); scanf_s("%d",&position); Node *q, *p = head; while (p->next!=NULL&&j<position-1) //将指针指向删除位置的前一位 { j++; p = p->next;
代码:
#include "stdafx.h" #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef int DataType; //提示:声明一个单链表类型 typedef struct Node { DataType data;
//基础题 1:创建五个元素的链表 void Creat_5_number_List(LinkList &head) { Node *r = head; Node *s; int a; printf("Please Input 5 data:\n"); for (int i=0;i<5;i++) { s= (Node*)malloc(sizeof(Node)); scanf_s("%d", &a); s->data = a; r->next = s; r = s; }
软件技术基础上机实验报告
(学生姓名) (学号) 上机实验二 ex2_1——基本题 1)首先创建一个单链表:从键盘读入五个整数,按输入顺序形成单链表。将创建好的链表 元素依次输出到屏幕上。 2)在已创建好的链表中插入一个元素:从键盘读入元素值和插入位置,调用插入函数完成 插入操作。然后将链表元素依次输出到屏幕上。 3)在已创建好的链表中删除一个元素:从键盘读入欲删除的元素位置(序号) ,调用删除 函数完成删除操作。然后将链表元素依次输出到屏幕上。 ex2_2——扩展题 1)创建一个单链表,其数据元素为整数,从键盘输入,输入 0 结束(注意 0 不放到链 表内) ; 2)从键盘任意输入一个整数,在单链表中查询该数,如果单链表中已经存在这个数, 就调用删除函数,删除该元素所在结点,并将单链表在删除前后的数据元素依次输出到屏 幕上; 如果单链表中不存在这个数,就调用插入函数,将这个数插入到单链表尾,并将单链表 在插入前后的数据元素依次输出到屏幕上。 3)教材第一章习题第 9 题(用链表实现) ex2_3——扩展题 1)删除单链表中全部的负数 2)创建一个双向链表,按照冒泡排序的思路对这个双向链表进行排序,打印排序结果。注 意,本算法在交换元素时是将链点整个交换而不是将链点中的元素值交换。
//扩展题 2.2.3:按大小找位置插入 void InsertInOrder(LinkList &head); //扩展题 2.3.1:删除链表中所有负数 void DeleteNegative(LinkList &head); //扩展题 2.3.2:双向链表排序问题 void SortDoubleList(DoubleLinkList &d_head);
ຫໍສະໝຸດ Baidu
******************************************************************************* 一、程序流程说明——有条理的文字或流程图* 由于此次上机题目较多,为了让老师看得更加容易,条理体现在代码注释中。 二、完整程序训练: (注:同样的,由于代码长达 400 多行,所有方法的编写和调用都已经 尽可能按照实验 PPT 题目的顺序来, 所以基础部分和扩展题的代码都不分开编写, 已经在代 码中有详细注释。 )
void PrintList(LinkList &head) { Node *p = head; Node *s = NULL; while (p->next != NULL) { s = p->next; p = s; printf("%d\t", s->data); } printf("\n"); }
} if (!p->next||j>position-1) { printf("Position Error!\n"); } q = p->next; p->next = q->next; free(q); printf("Delete success!After Deleting is:\n"); PrintList(head); } //扩展题 2.1: 创建链表表,以 0 作为结束输入的标志。 void CreatList(LinkList &head) { Node *p = head; Node *s = NULL; int a; printf("Input the data:\n"); while (scanf_s("%d", &a)) { if (a != 0) 节点 { s = (Node*)malloc(sizeof(Node)); s->data = a; p->next = s; p = s; } else { p->next = NULL; //输入为 0,p 为最后节点 printf("CreatList success!The list's data are:\n"); PrintList(head); break; } } } //扩展题 2.2 的插入函数:在末尾插入
//为节点分配 //输入
//P 指向下一节点即 S
} else { s->next = d_head; d_head->pre = s; break; } } printf("Creat success!\n"); }
//输入为 0 则将 s 指向的节点与头结点链接
//功能:打印双向链表所有元素 void PrintDouleList(DoubleLinkList &d_head) { DoubleNode *p = d_head->next, *s=NULL; printf("The data of double list are :\n"); do { printf("%d\t",p->data); s = p; //每输出一个节点的 data,P 指向下一节点直到 P 指向头结点为止 p = p->next; p->pre = s; s->next = p; }while (p!= d_head); printf("\nPrint ok!\n"); }
struct Node *next; }*LinkList; //声明一个双向链表节点类型 typedef struct DoubleNode { struct DoubleNode *pre; DataType data; struct DoubleNode *next; }*DoubleLinkList; //功能:初始化单链表函数 void InitList(LinkList &head); //功能:将单链表所有元素打印在控制台上 void PrintList(LinkList &head); //功能:初始化双向链表 void InitDoubleList(DoubleLinkList &d_head); //功能:创建双链表 void CreatDoubleList(DoubleLinkList &d_head); //功能:打印双链表所有元素 void PrintDouleList(DoubleLinkList &d_head); //基础题 2.1.1:创建 5 个元素的单链表函数 void Creat_5_number_List(LinkList &head); //基础题 2.1.2:在单链表中第 i 个位置插入值 e 的结点。插入成功返回 1,失败返回 0 int InsertDataByPosition(LinkList &head); //基础题 2.1.3:删除指定位置元素 void DeleteDataByPosition(LinkList &head); //扩展题 2.2.1:创建一个单链表,输入 0 时结束 void CreatList(LinkList &head); //扩展题 2.2.2 的插入函数: int InsertDataAtEnd(LinkList &head,int data); //扩展题 2.2.2:存在该元素则删除,不存在则插入表尾 void DeleteExistOrInsertNon_ExistentData(LinkList &head);
//功能:初始化双向链表 void InitDoubleList(DoubleLinkList &d_head) { d_head = (DoubleLinkList)malloc(sizeof(DoubleNode)); //为头结点分配存储 空间 if (d_head) { d_head->next = d_head->pre = d_head; //双向循环链表头结点 printf("Init Success!\n"); } else printf("Init Error!\n"); } //功能:创建双链表 void CreatDoubleList(DoubleLinkList &d_head) { int data; DoubleNode *p=d_head, *s=NULL; printf("Please input data:(end up with 0)\n"); while (scanf_s("%d",&data)) { if (data != 0) { s = (DoubleNode*)malloc(sizeof(DoubleNode)); 存储空间 s->data = data; data 赋值给该节点的 data s->pre = p; p->next = s; p = s;
void main() { Node *head = NULL; InitList( head); CreatList( head); //Creat_5_number_List(head); //InsertDataByPosition(head); //DeleteDataByPosition(head); DeleteExistOrInsertNon_ExistentData(head); //InsertInOrder(head); //DeleteNegative(head); /*DoubleNode *d_head = NULL; InitDoubleList(d_head); CreatDoubleList(d_head); PrintDouleList(d_head); SortDoubleList(d_head);*/ } //作用:初始化化链表 void InitList(LinkList&head) { head = (Node*)malloc(sizeof(Node)); //为头结点分配一个存储空间 if (!( head)) { printf("Init Error!"); exit(-1); } ( head)->next = NULL; //将单链表的头结点指针域置为空 printf("Init List Success.\n"); } //功能:将链表所有元素输出