DEMO1:     动态分配变量(链表,而静态数组是线性表,意味着动态数组访问和遍历复杂度为O(n),而插入和删除复杂度为O(1),而静态数组线性表则完全相反)

    int* intptr = new int(50);          //声明一指向整数的指针,在该内存中存入整数值50float* floatptr = new float;        //声明一指向浮点数的指针,但未指定内存中存储的数据值cout << "intptr 指向的数据值:" << *intptr << "\n\n";*floatptr = 0.5;cout << "floatptr 指向的数据值:" << *floatptr << "\n\n";delete intptr;delete floatptr;int *ptr=new int[num]; // 动态分配数组为n个元素 delete [] ptr;                // 释放分配给 ptr 的内存空间

DEMO2: 动态数组求和示例

int main() {int no, count = 0, Total = 0;   // 定义整数变量 count 与 Totalcout << "要输入计算的个数为:";cin >> no;int* ptr = new int[no]; // 动态分配数组为n个元素 cout << endl;for (count = 0; count < no; count++){cout << "输入ptr[" << count << "]:";cin >> ptr[count];            // 采用数组下标来输入数组元素}for (count = 0; count < no; count++)Total += *(ptr + count);       // 采用指针变量运算来存取数组的元素值cout << "---------------------------------------" << endl;cout << no << "个数的总和=" << Total;    // 显示结果cout << endl;delete[] ptr;                // 释放分配给 ptr 的内存空间ptr = NULL;system("pause");return 0;
}

DEMO3: 单向链表的创建与遍历:

输入12个学生的成绩(形成列表并打印)

#include <iostream>
using namespace std;
class list  //链表结构声明
{
public:int num, score;   //学号,得分char name[10];    //姓名class list* next; //指针变量,指向下一个节点
};
typedef class list node;
typedef node* link;int main()
{link newnode, ptr, delptr; //声明三个链表结构的指针cout << "请输入 5 位学生的数据:" << endl;delptr = new node;   //delptr暂当链表头指针if (!delptr){cout << "[Error!!内存分配失败!]" << endl;exit(1);}cout << "请输入座号:";cin >> delptr->num;cout << "请输入姓名:";cin >> delptr->name;cout << "请输入成绩:";cin >> delptr->score;ptr = delptr;   //保留链表头指针,以ptr为指向当前节点的指针for (int i = 1; i < 5; i++){newnode = new node;  //创建新节点if (!newnode){cout << "[Error!!内存分配失败!" << endl;exit(1);}cout << "请输入座号:";cin >> newnode->num;cout << "请输入姓名:";cin >> newnode->name;cout << "请输入成绩:";cin >> newnode->score;newnode->next = NULL;ptr->next = newnode; //把新节点加在链表后面ptr = ptr->next;     //让ptr保持在链表的最后面}cout << "\n  学  生  成  绩" << endl;cout << " 座号\t姓名\t成绩\n=====================" << endl;ptr = delptr;            //让ptr回到链表头while (ptr != NULL){cout << ptr->num << "\t" << ptr->name << "\t" << ptr->score << endl;delptr = ptr;ptr = ptr->next;     //ptr按序往后遍历整个链表delete delptr;     //释放内存空间}system("pause");
}

ptr = delptr;   //保留链表头指针,以ptr为指向当前节点的指针

newnode->next = NULL;   
        ptr->next = newnode; //把新节点加在链表后面
        ptr = ptr->next;     //让ptr保持在链表的最后面

step1:动态分配内存给新节点使用

step2:将原链表尾部的指针指向新元素所存在的位置(内存地址)

step3:将ptr指针指向新节点内存位置,表示这是新的链表尾部

step4:由于新的节点为当前链表的最后一个元素,所以将他的指针(next)指向NULL

DEMO4:

输入想删除的成绩(比如输入76),就开始遍历该链表,找到删除(含有76)该学生的节点,然后提示,输入新的成绩,学号,姓名。结束的时候输入 -1 ,即可输出全部列表

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string.h>
#include <iomanip> //操作符的头文件
using namespace std;
class list
{
public:int num, score;char name[10];class list* next;//指向下一个节点
};
typedef class list node;//定义node为新的数据类型
typedef node* link;     //定义link为新的数据类型指针   link findnode(link head, int num)
{link ptr;ptr = head;while (ptr != NULL){if (ptr->num == num)return ptr;ptr = ptr->next;}return ptr;
}link insertnode(link head, link ptr, int num, int score, char name[10])
{link InsertNode;InsertNode = new node;if (!InsertNode)return NULL;InsertNode->num = num;InsertNode->score = score;strcpy_s(InsertNode->name, name);InsertNode->next = NULL;if (ptr == NULL) //插入第一个节点{InsertNode->next = head;return InsertNode;}else{if (ptr->next == NULL)//插入最后一个节点{ptr->next = InsertNode;}else //插入中间节点{InsertNode->next = ptr->next;ptr->next = InsertNode;}}return head;
}int main()
{link head, ptr, newnode;int new_num, new_score;char new_name[10];int i, j, position = 0, find, data[12][2];char namedata[12][10] = { {"Allen"},{"Scott"},{"Marry"},{"John"},{"Mark"},{"Ricky"},{"Lisa"},{"Jasica"},{"Hanson"},{"Amy"},{"Bob"},{"Jack"} };srand((unsigned)time(NULL));cout << "座号  成绩  座号  成绩  座号  成绩  座号  成绩" << endl;cout << "==============================================" << endl;for (i = 0; i < 12; i++){data[i][0] = i + 1;//座号data[i][1] = rand() % 50 + 51;//成绩}for (i = 0; i < 3; i++){for (j = 0; j < 4; j++)cout << "[" << data[j * 3 + i][0] << "]  [" << data[j * 3 + i][1] << "]   ";cout << endl;}head = new node;  //建立链表头指针if (!head){cout << "Error!! 内存分配失败!!" << endl;exit(1);}head->num = data[0][0];for (j = 0; j < 10; j++)head->name[j] = namedata[0][j];head->score = data[0][1];head->next = NULL;ptr = head;for (i = 1; i < 12; i++) //建立链表{newnode = (link)malloc(sizeof(node));newnode->num = data[i][0];for (j = 0; j < 10; j++)newnode->name[j] = namedata[i][j];newnode->score = data[i][1];newnode->next = NULL;ptr->next = newnode;ptr = ptr->next;}while (1){cout << "请输入要插入其后的学生编号,结束输入-1:";cin >> position;if (position == -1)//循环中断条件break;else{ptr = findnode(head, position);cout << "请输入新插入的学生编号:";cin >> new_num;cout << "请输入新插入的学生成绩:";cin >> new_score;cout << "请输入新插入的学生姓名:";cin >> new_name;head = insertnode(head, ptr, new_num, new_score, new_name);}}ptr = head;cout << "\n\t座号\t    姓名\t成绩\n";cout << "\t==============================\n";while (ptr != NULL){cout << "\t[" << ptr->num << "]\t[ " << ptr->name << "]" << setw(6) << "\t[" << ptr->score << "]\n";ptr = ptr->next;}delete head;system("pause");return 0;
}

DEMO5: 删除链表节点

#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>  //使用随机数的头文件
using namespace std;
class list
{public:int num,score;char name[10];class list *next;
};
list del_ptr(list *head,list *ptr);
int main()
{  list *ptr;int findword=0,find,data[12][2];char namedata[12][10]={{"Allen"},{"Moko"},{"Lean"},{"Melissa"},{"Angel"},{"Sabrina"},{"Joyce"},{"Jasica"},{"Hanson"},{"Amy"},{"Bob"},{"Jack"}};srand((unsigned)time(NULL));//以时间为随机数的种子cout<<"座号 成绩  座号 成绩  座号 成绩  座号  成绩"<<endl;cout<<"=============================================="<<endl;for(int i=0;i<12;i++){  data[i][0]=i+1;data[i][1]=rand()%50+51;}for(int i=0;i<3;i++){  for (int j=0;j<4;j++)cout<<"["<<data[j*3+i][0]<<"]  ["<<data[j*3+i][1]<<"]  ";cout<<endl;}list *head=new list;//建立链表头指针if(!head){  cout<<"Error!! 内存分配失败!!"<<endl;exit(1);}head->num=data[0][0];for (int j=0;j<10;j++)head->name[j]=namedata[0][j];head->score=data[0][1];head->next=NULL;ptr=head;for(int i=1;i<12;i++)                   {  list *newnode=new list;//建立链表newnode->num=data[i][0];for (int j=0;j<10;j++)newnode->name[j]=namedata[i][j];newnode->score=data[i][1];newnode->next=NULL;ptr->next=newnode;ptr=ptr->next;}while(1){  cout<<"请输入要删除的成绩,结束输入-1:";cin>>findword;if(findword==-1)//循环中断条件break;else{  ptr=head;find=0;while (ptr!=NULL){  if(ptr->score==findword)     {  *ptr=del_ptr(head,ptr);//删除数据find++;}ptr=ptr->next;}if(find==0)cout<<"######没有找到######"<<endl;}}ptr=head;cout<<"\n\t座号\t    姓名\t成绩"<<endl; //输出剩余链表中的数据cout<<"\t=============================="<<endl;while(ptr!=NULL){  cout<<"\t["<<ptr->num<<"]\t["<<setw(10)<<ptr->name<<"]\t["<<ptr->score<<"]"<<endl;ptr=ptr->next;}system("pause");
}
list del_ptr(list *head,list *ptr)//删除节点子程序
{  list *top;top=head;if(ptr==head)//[情形1]:删除节点在链表头部{  head=head->next;cout<<"已删除第 "<<ptr->num<<" 号学生!!姓名: "<<ptr->name<<endl;}else{  while(top->next!=ptr)//找到删除节点的前一个位置top=top->next;if(ptr->next==NULL)  //[情形2]:删除节点在链表尾部{  top->next=NULL;cout<<"已删除第 "<<ptr->num<<" 号学生!!姓名: "<<ptr->name<<endl;}else  //[情形3]:删除节点在链表中间的任一节点{  top->next=ptr->next;cout<<"已删除第 "<<ptr->num<<" 号学生!!姓名: "<<ptr->name<<endl;}}delete []ptr;  //释放内存空间return *head;  //返回链表
}

DEMO6:将学生成绩按座号反转打印出来,单链链表反转

/*
[名称]:ch03_06.cpp
[示范]:将学生成绩按座号反转打印出来
*/
#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>
using namespace std;
class list
{public:int num,score;char name[10];class list *next;
};
typedef class list node;
typedef node *link;
int main()
{  link ptr,last,before;int i,j,findword=0,data[12][2];char namedata[12][10]={{"Allen"},{"Mako"},{"Lean"},{"Melissa"},{"Angel"},{"Sabrina"},{"Joyce"},{"Jasica"},{"Hanson"},{"Amy"},{"Bob"},{"Jack"}};srand((unsigned)time(NULL));for (i=0;i<12;i++){  data[i][0]=i+1;data[i][1]=rand()%50+51;}link head=new node;//建立链表头指针if(!head){  cout<<"Error!! 内存分配失败!!"<<endl;exit(1);}head->num=data[0][0];for (j=0;j<10;j++)head->name[j]=namedata[0][j];head->score=data[0][1];head->next=NULL;ptr=head;for(i=1;i<12;i++) //建立链表{  link newnode=new node;newnode->num=data[i][0];for (j=0;j<10;j++)newnode->name[j]=namedata[i][j];newnode->score=data[i][1];newnode->next=NULL;ptr->next=newnode;ptr=ptr->next;}ptr=head;i=0;cout<<"原始链表数据:"<<endl;               while (ptr!=NULL)                       {   //打印链表数据cout<<"["<<setw(2)<<ptr->num<<setw(8)<<ptr->name<<setw(3)<<ptr->score<<"] -> ";i++;if(i>=3) //三个元素为一行{  cout<<endl;i=0;}ptr=ptr->next;}ptr=head;before=NULL;cout<<"\n反转后链表数据:"<<endl;          while(ptr!=NULL) //链表反转{  last=before;before=ptr;ptr=ptr->next;before->next=last;}ptr=before;while(ptr!=NULL){  cout<<"["<<setw(2)<<ptr->num<<setw(8)<<ptr->name<<setw(3)<<ptr->score<<"] -> ";i++;if(i>=3){  cout<<endl;i=0;}ptr=ptr->next;}system("pause");
}

DEMO7: 单向链表连接功能

/*
[名称]:ch03_07.cpp
[示范]:单向链表的连接功能
*/
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
class list
{
public:int num, score;char name[10];class list* next;
};
typedef struct list node;
typedef node* link;
link concatlist(link, link);int main()
{link head, ptr, newnode, last, before;link head1, head2;int i, j, findword = 0, data[12][2];//第一组链表的姓名 char namedata1[12][10] = { {"Allen"},{"Scott"},{"Marry"},{"Jon"},{"Mark"},{"Ricky"},{"Lisa"},{"Jasica"},{"Hanson"},{"Amy"},{"Bob"},{"Jack"} };//第二组链表的姓名char namedata2[12][10] = { {"May"},{"John"},{"Michael"},{"Andy"},{"Tom"},{"Jane"},{"Yoko"},{"Axel"},{"Alex"},{"Judy"},{"Kelly"},{"Lucy"} };srand((unsigned)time(NULL));for (i = 0; i < 12; i++){data[i][0] = i + 1;data[i][1] = rand() % 50 + 51;}head1 = new node; //建立第一组链表的头指针if (!head1){cout << "Error!! 内存分配失败!!" << endl;exit(1);}head1->num = data[0][0];for (j = 0; j < 10; j++)head1->name[j] = namedata1[0][j];head1->score = data[0][1];head1->next = NULL;ptr = head1;for (i = 1; i < 12; i++)//建立第一组链表{newnode = new node;newnode->num = data[i][0];for (j = 0; j < 10; j++)newnode->name[j] = namedata1[i][j];newnode->score = data[i][1];newnode->next = NULL;ptr->next = newnode;ptr = ptr->next;}srand((unsigned)time(NULL));for (i = 0; i < 12; i++){data[i][0] = i + 13;data[i][1] = rand() % 40 + 41;}head2 = new node; //建立第二组链表的头指针if (!head2){cout << "Error!! 内存分配失败!!\n";exit(1);}head2->num = data[0][0];for (j = 0; j < 10; j++)head2->name[j] = namedata2[0][j];head2->score = data[0][1];head2->next = NULL;ptr = head2;for (i = 1; i < 12; i++)//建立第二组链表{newnode = new node;newnode->num = data[i][0];for (j = 0; j < 10; j++)newnode->name[j] = namedata2[i][j];newnode->score = data[i][1];newnode->next = NULL;ptr->next = newnode;ptr = ptr->next;}i = 0;ptr = concatlist(head1, head2);//将链表相连接cout << "两个链表相连接的结果:" << endl;while (ptr != NULL){   //输出链表数据cout << "[" << ptr->num << " " << ptr->name << "  " << ptr->score << " ]\t-> ";i++;if (i >= 3)//三个元素为一行{cout << endl;i = 0;}ptr = ptr->next;}delete newnode;delete head2;system("pause");return 0;
}
link concatlist(link ptr1, link ptr2)
{link ptr;ptr = ptr1;while (ptr->next != NULL)ptr = ptr->next;ptr->next = ptr2;return ptr1;
}

基础数据结构【二】————动态数组,单向链表及链表的反转相关推荐

  1. 第二十二篇 玩转数据结构——构建动态数组

    1.. 数组基础 数组就是把数据码成一排进行存放. Java中,数组的每个元素类型必须相同,可以都为int类型,string类型,甚至是自定义类型. 数组的命名要语义化,例如,如果数组用来存放学生的成 ...

  2. 【数据结构】动态数组

    目录 一.线性表接口 二.动态数组 2.1动态数组的变量和构造方法 2.2添加元素 2.3输出数组的字符串形式 2.4在索引为index的位置插入新元素 2.5查询线性表中是否包含指定元素 2.6返回 ...

  3. 从零开始实现数据结构(一) 动态数组

    动态数组是所有数据结构中最简单的一种,甚至在很多的语言中,数组本身就是可以不定长的.因为在学习c++的时候,使用动态数组的各种操作都不是很方便(数据结构的学习最好还是c或c++,基础打好了其他的语言数 ...

  4. java多维数组的指针_Java基础之二维数组

    二维数组概念 二维数组的概念 对于二维数组的理解,我们可以看成一位数组arrary1有作为另一个一维数组arrary2的元素存在.从底层机制来看没有多维数组概念 2二维数组的使用 二维数组的声明与初始 ...

  5. 基于java的数据结构学习——动态数组C++类模板(含拷贝构造,重载常见运算符)

    之前实现了java的动态数组,试着写了个C++版的,同样对时间复杂度振荡进行了处理.纯手打,代码如下 : // // Created by PC-Saw on 2018/12/19. //#ifnde ...

  6. 从零开始实现数据结构(二) 有序数组

    有序数组顾名思义就是数组内所有元素的排列都是按照一定的顺序的.不管插入元素是多少,有序数组都会自动将该元素插入合适的位置.这里要实现的是一个定长的有序数组. 一.有序数组COrderArray类 要实 ...

  7. nginx学习七 高级数据结构之动态数组ngx_array_t

    1 ngx_array_t结构 ngx_array_t是nginx内部使用的数组结构.nginx的数组结构在存储上与大家认知的C语言内置的数组有相似性.比方实际上存储数据的区域也是一大块连续的内存. ...

  8. 减小程序规模!稀疏数组Sparsearray,数据结构二维数组与稀疏数组转换,Java实现

    文章目录 基本介绍 应用实例 基本介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: ①记录数组一共有几行几列,有多少个不同的值(0除外) ...

  9. java二维数组省略_Java基础教程——二维数组

    二维数组 Java里的二维数组其实是数组的数组,即每个数组元素都是一个数组. 每个数组的长度不要求一致,但最好一致. // 同样有两种风格的定义方法 int[][] _arr21_推荐 = { { 1 ...

  10. Numpy基础(二)——数组转置、计算内积和换轴

    1 数组转置   转置是一种特殊的数据重组形式,可以返回底层数据的视图而不需要复制任何内容.利用数组的transpose方法或者数组的T属性实现. In [88]: arr=np.arange(15) ...

最新文章

  1. sqap不支持python3吗_Supporting Python 3(支持python3)——欢迎来到Python 3
  2. 安装华为T2000软件,无法初始化MS SQL 2000问题解决办法
  3. element表格取消全选_ElementUi 表格取消全选框,用文字表示
  4. mini2440 u-boot linux 内核启动,u-boot.2012.10——mini2440(二、启动流程分析)
  5. hibernate的映射文件字段长度和数据库里面的字段长度
  6. Java面向对象(13)--==操作符与equals方法
  7. HeadFirst设计模式之观察者模式学习
  8. FFT节省资源的思路
  9. 《C语言程序设计基础I》秋季学习总结
  10. TurboMail成功建设某省建工集团邮件系统
  11. 【Oracle】详解ADDM工具
  12. Linux内核同步机制--自旋锁【转】
  13. 餐巾(cogs 461)
  14. Swift进阶 - 更高效的使用集合
  15. 提取Flash源文件中的素材
  16. GandCrab勒索病毒
  17. 如何用一根网线连接两台电脑,传输大文件
  18. js切换图片会闪动_js图片闪动特效可以控制间隔时间如几分钟闪动一下
  19. 爬完点评爬某东,爬他个600多本书籍资料
  20. 我对管理和领导的理解

热门文章

  1. PHP如何把三张图片均匀分布,怎么把一张图片分成9张
  2. mysql数据库增删改实例_Mysql1:数据库表操作,增删改查举例
  3. java for 跳过_在for循环中跳过错误
  4. mysql需要备份的数据_Mysql根据需要备份数据
  5. mysql新建表96k_innodb表 手工导入导出
  6. 计算机导论简答芯片,吉大计算机 - 计算机导论简答题 (2011级)
  7. 抖音爬取粉丝用户列表_抖音分享页用户信息爬取
  8. linux内核定义的常用信号6,Linux中的信号
  9. 使用Python和OpenCV检测图像中的条形码
  10. Python访问街区10个点,并俩俩绘制一条线,得到5条线,求最短的距离和?