c语言代码实现
注:函数功能和注释都在代码里
#include<stdio.h>
#include<stdlib.h>
//学生结构体
typedef struct
{
int age;
int height;
double weight;
}Student;
//单链表节点类型
typedef struct node
{
Student stu;
struct node* next;
}Node;
//创建节点函数
Node* CreateNode(Student *stu)
{
//申请一个节点空间
Node* node = (Node*)malloc(sizeof(Node));
//判断是否申请成功
if (!node)return NULL;
//初始化一个节点
node->next = NULL;
node->stu = *stu;
//返回节点
return node;
}
//输入节点信息函数
void InputValue(Student *stu)
{
if (stu == NULL)return;
printf("输入学生年龄,身高,体重\r\n");
scanf_s("%d%d%lf", &stu->age, &stu->height, &stu->weight);
}
//创建单链表函数
Node *CreateLink()
{
Student stu = { 0 };
//创建一个头节点
Node* head = CreateNode(&stu);
if (!head)return NULL;
//添加其他节点
int tag = 0;
printf("添加其他节点,如果是输入1,否则输入0\r\n");
scanf_s("%d", &tag);
Node* tail = head;
Node* pnew;
while (tag!=0)
{
InputValue(&stu);
pnew = CreateNode(&stu);
if (!pnew)return NULL;
tail->next = pnew;
tail=pnew;
printf("添加其他节点,如果是输入1,否则输入0\r\n");
scanf_s("%d", &tag);
}
tail->next = head;//构成循环单链表
//返回节点
return head;
}
//销毁单链表函数
int DeleteLink(Node *head)
{
if (!head)return 0;
//如果为非空,则逐个释放
Node * p, * q;
p = head;
while (p->next != NULL && p->next!=head)
{
q = p->next;
p->next= q->next;
free(q);
}
free(head);
return 1;
}
//打印学生信息函数
void DisplayValue(Student *stu)
{
if (!stu)return;
printf("age=%5d,height=%5d,weight=%5lf\r\n", stu->age, stu->height, stu->weight);
}
//遍历循环链表函数
void DisplayLink(Node * head)
{
if (!head)return;
Node* p=head->next;
for (p=head->next;p != head ;p=p->next )
{
DisplayValue(&p->stu);
}
}
//在指定位置插入节点函数
void InsertNode(Node *head,Node *pnew,int add)
{
//判断是否为空
if (!head|| !pnew)return;
if (add < 0)return;
//找到插入位置
Node* p = head;
int i = 0;
for (i=0; i < add && p->next != head; i++)
{
p = p->next;
}
if (p->next == head && i<add)return;//插入位子超出范围
pnew->next = p->next;
p->next = pnew;
}
//在指定位置删除节点函数
void DeleteNode(Node *head,int add)
{
if (!head)return;
Node* p=head;
Node* q;
for (int i = 0; i < add && p->next != head; i++)
{
p = p->next;
}
if (p->next == head)return;//删除节点超出范围
q = p->next;
p->next = q->next;
free(q);
}
int main()
{
//创建链表
Node* head = CreateLink();
//显示链表所有节点信息
DisplayLink(head);
//在链表指定位置插入节点
Student stu = { 4,4,4 };
InputValue(&stu);
Node* pnew = CreateNode(&stu);
InsertNode(head, pnew,1);
printf("插入新节点后的单链表\r\n");
DisplayLink(head);
//在链表指定位置删除节点
DeleteNode(head,3);
printf("删除节点后的单链表\r\n");
DisplayLink(head);
//释放链表空间
DeleteLink(head);
return 0;
}