数据结构-单向链表
单向链表实现学生录入程序
将用户输入的不定个数的学生成绩按顺序编号并保存,以用户输入0作为录入结束标志,此时按编号顺序输出各学生录入成绩。
通过main函数实现一切功能
//
#include "stdafx.h" //其中包括了stdio和stdlib
struct student
{
int grade;
struct student*next; //指向结构体student类的指针
}; //记一下哈 定义结构体结尾要加分号
// 定义了一个叫student的结构体,
typedef struct student Node; //使用typedef给student声明了别名
typedef Node* Ptr; //使用typedef给student结构体指针声明了别名
int main()
{
int i;
Ptr head, previous, last; //定义三个student结构体类型指针 贴心翻译 头,先前,最后
head = (Ptr)malloc(sizeof(Node)); //申请第一个结点的空间
if (head == NULL) //如果申请失败,程序退出
{
return -1;
}
scanf_s("%d", &head->grade); //别问我为啥不用scanf,自行百度/滑稽
previous = head;
while (1)
{
//申请当前最后一个结点的空间
last = (Ptr)malloc(sizeof(Node));
if (last == NULL)
{
return -1;
}
previous->next = last; //链接结点
scanf_s("%d", &last->grade);
if (last->grade == 0) //如果录入的是0处理掉尾结点之后的结点,将尾节点指针next赋值为NULL
{
free(last);
previous->next = NULL;
break;
}
//如果不是0,previous指针获得当前的地址,last指针继续申请下一个节点空间
previous = last;
}
for ( i = 0; head!=NULL; i++) //循环输出
{
printf_s("第%d个学生的成绩为%d\n", i + 1, head->grade);
previous = head; //将输出后的结点地址赋值给previous指针,准备释放该空间
head = head->next; //头指针指向下一结点,下一结点成为第一结点
free(previous);
}
return 0;var foo = 'bar';
通过调用函数实现
#include "stdafx.h" //头文件 不说了
struct student
{
int grade;
struct student *next;
};
typedef struct student Node;
typedef Node* Ptr;
Ptr CreatLinkllist();
void Show(Ptr head);
int main()
{
Ptr head;
head = CreatLinkllist();
Show(head);
return 0;
}
Ptr CreatLinkllist()
{
Ptr head, previous, last;
head = (Ptr)malloc(sizeof(Node));
if (head == NULL)
{
return NULL;
}
scanf_s("%d", &head->grade);
previous = head;
while (1)
{
last = (Ptr)malloc(sizeof(Node));
if (last == NULL)
{
return NULL;
}
previous->next = last;
scanf_s("%d", &last->grade);
if (last->grade == 0)
{
free(last);
previous->next = NULL;
break;
}
previous = last;
}
return head;
}
void Show(Ptr head)
{
int i;
Ptr previous;
for (i = 0; head != NULL; i++)
{
printf_s("第%d个学生的成绩是%d\n", i + 1, head->grade);
previous = head;
head = head->next;
free(previous);
}
}