数据结构-双向链表
双向链表实现学生录入功能
双向链表实现
#include "stdafx.h"
struct Student
{
int grade;
struct Student *next;
struct Student *back;
};
typedef struct Student Node;
typedef Node* Ptr;
int main()
{
Ptr head;
Ptr Creatlink();
Ptr Show1(Ptr head);
void Show2(Ptr head);
head = Creatlink(); //注意三个head的位置 返回第一个结点的地址
head = Show1(head); //返回最后一个结点
Show2(head); //void不返回
return 0;
}
Ptr Creatlink()
{
Ptr head, previous, last;
int num, i; //num变量是学生成绩
//申请第一个节点空间
head = (Ptr)malloc(sizeof(Node));
if (head == NULL)
{
printf_s("wrong");
return NULL;
}
head->back = NULL; //第一个结点的back指针赋值为NULL
previous = head; //将第一个结点设置为当前结点
scanf_s("%d", &num); //获取用户第一次输入的成绩
while (num != 0)
{
previous->grade = num; //将用户输入的num赋值给当前结点的数据域
last = (Ptr)malloc(sizeof(Node));
if (last == NULL)
{
printf_s("wrong!");
return NULL;
}
last->back = previous; //与上一个结点(当前结点)相连,新结点(last)back指针指向当前结点
previous->next = last; //上一个结点(当前结点)与新结点(last)链接
previous = last; //新结点变为当前结点,准备开辟新结点录入新数据循环上述操作
scanf_s("%d", &num); //继续录入成绩 知道满足num=0 退出循环否则一直开辟
}
previous = previous->back; //最后录入的0为无效数据,需要释放,先把当前指针指向倒数第二个结点(第一个是0)
previous->next = NULL; //将倒数第二个结点的next指针设为NULL;
free(last); //释放最后一个结点,倒数第二个结点next指针也不指向它了,倒数第二成为倒数第一
return head; //返回第一个结点的地址
}
Ptr Show1(Ptr head)
{
Ptr previous;
printf_s("正向输出:");
while (head != NULL)
{
printf_s("%d\n", head->grade);
previous = head;
head = head->next; //head不断指向下一个结点,知道下一个结点的next指针为NULL(最后一个)循环正向输出
}
return previous; //head=head->next 为NULL previous指向最后一个结点
}
void Show2(Ptr head) //同理,但要注意传入参数head的位置不在头结点反而在尾结点
{
Ptr previous;
printf_s("反向输出:");
while (head !=NULL)
{
printf_s("%d\n", head->grade);
previous = head;
head = head->back;
free(previous);
}
}