程序代码:
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #define MAXSIZE 100 #define num 10 typedef int Elemtype; typedef struct{ Elemtype *data; int length; }SqList; SqList InitList(){ SqList L; L.data=(Elemtype *)malloc(sizeof(Elemtype)*MAXSIZE); if(L.data==NULL){ printf("动态空间分配失败!\n"); exit(1); } L.length=0; return(L); } int Insert(SqList &L,int i,Elemtype x){ if(i<1||i>L.length+1) return 0; if(L.length==MAXSIZE) return 0; for(int j=L.length-1;j>i-1;j--){ L.data[j+1]=L.data[j]; } L.data[i-1]=x; L.length++; return 1; } void Traverse(SqList L){ for(int i=0;i<L.length;i++){ printf("\t%d",L.data[i]); } } void Create(SqList &L){ int i,x; for(i=1;i<=num;i++){ x=rand(); Insert(L,i,x); } } void Reverse(SqList &L){ int i,j,k; for(i=0,j=(L.length-1);j>i;i++,j--){ k=L.data[i]; L.data[i]=L.data[j]; L.data[j]=k; } } void main(){ int i=1; SqList L=InitList(); while(i!=0){ printf("\n Linked List Example \n"); printf("1.Create 10 random number;\n"); printf("2.Reverse the Linked List;\n"); printf("3.Traverse the Linked List;\n"); printf("0.Exit the program;\n"); printf("Please input your selection(0-3):"); scanf("%d",&i); switch(i){ case 0:exit(0); case 1:Create(L);break; case 2:Reverse(L);break; case 3:Traverse(L);break; default:printf("input error!please select again!"); } } } |
运行截图:
实验小结
理解动态数组与静态数组的区别
(1)静态数组在内存中位于栈区,是在定义时就已经在栈上分配了固定大小,在运行时这个大小不能改变,如:int a[10];
动态数组是malloc或者new出来的,位于内存的堆区,它的大小是在运行时给定,并且可以改变其,如:
int *a;
int m_num = 10;
a = new int[m_num ];
(2)静态数组的大小是在编译期间就确定,并且分配的,其内存在使用结束后由计算机自动释放,效率高;动态数组是在程序运行时,由程序员根据实际需要从堆内存中动态申请的,使用结束后由程序员进行释放,效率低。
(3)在函数内部声明的静态数组不可能通过函数返回,因为生存期的问题,函数调用完其内部变量占用的内存就被释放了。如果想通过函数返回一个数组,可以在函数中用new动态创建该数组,然后返回其首地址。静态数组是在栈中申请的,而函数中的局部变量也是在栈中的,而new动态数组是在堆中的分配的,所以函数返回后,栈中的申请的内存被自动释放,而堆中申请的内存如果没有delete就不会自动释放。
区分“=”与“==”
二者的含义不同,“=”是赋值号;“==”是条件判断语句中是否相等的意思。
二者的作用不同,“=”的作用是将一个表达式的值赋给一个左值。一个表达式或者是一个左值,或者是一个右值。所谓左值是指一个能用于赋值运算左边的表达式。左值必须能够被修改,不能是常量。我们用变量作左值,还可以看到,指针和引用也可以作左值。“==”当左边的内容与右边的内容相同时,返回1。其余时候返回0。“==”是判断两个值大小是否相同的运算符。