程序代码:
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #define LEN sizeof(struct Lnode) #define num 10 typedef int Elemtype; typedef struct Lnode{ Elemtype data; struct Lnode *next; }Lnode,*LinkList; LinkList InitList(){ LinkList L=(struct Lnode*)malloc (LEN); if(L==NULL){ printf("动态空间分配失败!\n"); exit(1); } L->next=NULL; return(L); } int Insert(LinkList L,int i, Elemtype x) { struct Lnode* p=L; struct Lnode* newp; int count=0; if(i<1){ printf("插入位置错误!\n"); return(0); } while((p!=NULL)&&(count<i-1)){ p=p->next; count++; } if(p==NULL){ printf("链表长度小于%d.\n",i-1); return(0); } newp =(struct Lnode*)malloc (LEN); if(newp==NULL){ printf("动态空间分配失败!\n"); return(0); } newp->data=x; newp->next=p->next; p->next=newp; return(1); } void Traverse(LinkList L) { struct Lnode* p=L->next; while(p!=NULL){ printf("\t%d",p->data); p=p->next; } } void Create (LinkList L){ int i,j; for(i=1;i<num;i++){ j=rand(); Insert(L,i,j); } } void Reverse(LinkList L){ struct Lnode* cp=L->next; struct Lnode* pp=NULL; struct Lnode* np; while(cp){ np=cp->next; cp->next=pp; pp=cp; cp=np; } L->next=pp; } void main(){ int i=1; LinkList L; 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!"); } } } |
程序截图:
实验小结
灵活运用typedef函数
在本次实验中,我了解到结构体可以使用typedef函数,为算法代码的编写带来了极大的便利。struct LinkList 以及 struct LinkList* 均可用一个单词代替,使得主程序的编写更难出错,保持了较高的正确性,并且增加了程序的可读性。对命名一个简单的类型名代替复杂的类型表示方法总结如下:
(1)命名一个新的类型名代表结构体类型
typedef struct{
int month;
int day;
int year;
}Date;
(2)命名一个新的类型名代表数组类型
Typedef int Num[100];
Num a; //定义a为整型数组名,它有100个元素
厘清函数传值机制
实参向形参的数据传递是“值传递”,单向传递,只能由实参传给形参,而不能由形参传递给实参。实参和形参在内存中占有不同的存储单元,实参无法得到形参的值。函数调用结束时,形参即刻被释放,实参单元仍保留并维持原值,没有改变。所以本次实验我们传递给函数的是头结点的地址,使得函数通过地址找到头结点,并对头结点进行操作,而不能直接传递头结点,否则对头结点的操作将在函数结束时被释放。