初识链表照着书上敲了完整的,大家看看哪里有问题!欢迎留言!
创建链表节点
单链表初始化
单链表的建立
/*链表的初始化、创建以及输出*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
//创建一个链表的基本步骤:创建链表节点,单链表初始化(即头结点的创建),单链表的建立
//创建链表节点
typedef struct node
{char name[20];int number;struct node * next;//指向本结构体的指针
}Node,*LinkList;
//Node是结构体类型,LinkList是结构体指针类型,Node * head等价于LinkList head
//单链表初始化
LinkList InitList()
{LinkList head;//创建头结点head=(Node *)malloc(sizeof(Node));head->next=NULL;//头结点的指针域为空 结构体变量名.成员名==结构体指针变量名->成员名==(*结构体指针变量名).成员名 return head;//返回头结点地址
}
//尾插法创建单链表
void CreatByRear(LinkList head)//形参为头结点地址
{Node * r,* s;//等价于LinkList r,s; char name[20];int number;r=head;//r指向链表头结点 printf("请输入学生的姓名和学号:\n");while(1)//如果学号为0,退出循环{scanf("%s",name);scanf("%d",&number);if(number==0)break;s=(Node *)malloc(sizeof(Node));strcpy(s->name,name);s->number=number;//s中存储新的信息r->next=s;//原来头结点的指针域指向新的节点r=s;//r里面存储了新节点的内容,等到第二次进入循环时,s会存储新的内容 //而r里面第一次的存储的节点的指针域指向这个新的节点,以此类推就可以实现链表的建立 }r->next=NULL;//链表的尾节点为空
}
//头插法创建单链表
void CreatByHead(LinkList head)
{Node * s;char name[20];int number;printf("请输入学生的姓名和学号:\n");while(1){scanf("%s",name);scanf("%d",&number);if(number==0)break;s=(Node *)malloc(sizeof(Node));strcpy(s->name,name);s->number=number;s->next=head->next;//新节点的指针域指向头节点head->next=s;//链表的头结点指向新节点,相当于把第一个数据放在最末尾//且进入循环的第一个节点的指针域为空,相当于一个尾节点,依次往前插入新的数据 }
}
//输出单链表
void OutPut(LinkList head)
{Node * p;p=head->next;//p指向链表的首元节点;printf("\n*********学生信息如下***********\n");while(p){printf("%s\n",p->name);printf("%d\n",p->number);p=p->next;//移动到下一个节点 }
}
//头插法和尾插法输出的不一样尾插法会按照输入的顺序输出,头插法刚好相反
int main()
{LinkList ha,hb;ha=LinkList();//头结点CreatByRear(ha);//尾插法创建链表 OutPut(ha);//输出单链表hb=LinkList();CreatByHead(hb);OutPut(hb);
}