单链表的创建与遍历
单链表的创建与遍历:
首先链表中节点分为数据域和指针域,数据域存储数据(比如学生信息:姓名,年龄),指针域指向下一个节点(和下一个学生的信息表连接起来的关键)。
通俗说:我创建了许多学生信息的结构体,每个结构体内都存储着一个数据的集合例如:张三信息表(张三的姓名,张三的年龄)、李四信息表(李四的姓名,李三的年龄)。。。。。
现在要把这么多的信息统一起来建立一个档案册。
一般比如说 数组,存储空间连续,在32位的系统中,int类的a[100],a[1]的地址加上四个字节就找到了a[2]的地址,你随便怎么找,你a[1]的地址加上8字节,你就找到了a[3]的地址,通过地址就可以访问内容。
现在结构体是分开的,存储位置不定,你不可能根据张三的结构体,不知道与李四结构体间隔大小的情况下,找到李四结构体的地址。
所以聪明的人们发明了结构体
结构体 张三的信息表(张三的姓名,张三的年龄,指针:指向下一位同学信息表地址)
指针类型的区别:自己查资料,此处struct node *就是结构体指针的定义 ,初学肯定看到struct node *就头大,这是什么东西。
比如int类型指针指向int类型的数据,char类型指针指向char类型数据,你就把结构体看成int那样的数据类型就简单了。
1 #include <iostream> 2 3 using namespace std; 4 5 struct node //创建链表的结构体 6 { 7 char name[20]; 8 int age; 9 struct node*next; //结构体指针指向下一个结构体的地址 10 }; 11 12 13 struct node* createList(int n) //创建结构体函数,返回结构体的头结点,n是参数需要在使用函数时候传入,定义由n个结构体组成的链表 14 { 15 struct node *head=new struct node; //定义一个结构体的头结点 16 struct node *pre=head; //首先定义上一个结构体指针 17 for(int i=0;i<n;i++) 18 { 19 20 struct node *p=new struct node; //定义一个新的结构体 21 cout<<"请输入第"<<i+1<<"个学生的姓名和年龄:"; 22 cin>>p->name; //输入新定义结构体的姓名 23 cin>>p->age; //输入新定义结构体的年龄 24 25 pre->next=p; //上一个结构体的指针域指向下一个结构体 26 pre=p; //把上一个指针指向新定义的结构体 27 p->next=NULL; //把新定义的结构体指向空,也使最后一个结构体指向空 28 } 29 return head; 30 } 31 32 void display(struct node *head) //遍历结构体 33 { 34 struct node *p=head->next; //定义结构体指针指向头结点的指针域 找到头结点的下一个结构体 35 while(p!=NULL) //因为最后一个结构体的指针域为空,当遍历完最后一个结构体就结束 36 { 37 cout<<p->name<<" "<<p->age<<endl; //向屏幕输出姓名 年龄 38 p=p->next; //结构体指针指向下一个结构体 循环进行 39 } 40 } 41 42 int main() 43 { 44 int n=5; 45 struct node *head=createList(n); //使用函数,传入参数,并让节后提指针head指向链表的头结点 46 display(head); //传入结构体指针的头结点指针,在函数体内遍历 47 return 0; 48 }
你也可以使用typedef重命名
typedef struct node { char name[20]; int age; struct node*next; }student;
以后使用struct node *就可以变成student *,这个方法主要是简化代码,但是为了更好理解,刚开始还是写全!