写一个函数insert,用来向一个动态链表插入节点。

写一个函数insert,用来向一个动态链表插入节点。

方法一:

#include <stdio.h>
#include <stdlib.h>

struct Student
{                       //声明结构体(双向链表结构体)
	int num;
	float score;
	struct Student *prev;
	struct Student *next;
};

struct Student *input();                     //声明输入函数
struct Student *insert(struct Student **stu, int m, char direc, struct Student *ins);   //声明插入函数
void print(struct Student *stu);             //声明输出函数

int main()
{
	struct Student *stud, in, *inser;        //定义结构体指针,插入的结构体变量,指向插入结构体变量的指针
	int insert_num;                   //定义要插入的结点学号
	char dir;                         //定义前插后插的方向变量
	stud=input();                     //调用输入函数
	print(stud);                      //输出全部数据
	printf("Please enter insert student info: ");      //输入要插入的学生数据(学号和成绩)
	scanf("%d %f", &in.num, &in.score);
	getchar();
	inser=&in;                        //结构体变量指针指向in
	printf("Please enter insert num: ");               //输入要插入哪个学号
	scanf("%d", &insert_num);
	getchar();
	printf("Please enter F or B: ");                   //输入是要插入学号前还是后,F是前插,B是后插。
	scanf("%c", &dir);
	getchar();
	stud=insert(&stud, insert_num, dir, inser);             //调用插入函数,并把返回值head赋值给stud 
	print(stud);
	return 0;
}

//输入函数
struct Student *input()
{
	struct Student *p1, *p2, *head;
	int n=0;
	p1=p2=(struct Student*)malloc(sizeof(struct Student));
	printf("Please enter No.%d student info: ", n+1);
	scanf("%d %f", &p1->num, &p1->score);
	getchar();
	head=NULL;
	while (p1->num!=0)
	{
		n++;
		if (n==1)
		{
			head=p1;
			p1->prev=NULL;
		}
		else
		{
			p2->next=p1;
			p1->prev=p2;
		}
		p2=p1;
		p1=(struct Student*)malloc(sizeof(struct Student));
		printf("Please enter No.%d student info: ", n+1);
		scanf("%d %f", &p1->num, &p1->score);
		getchar();
	}
	p2->next=NULL;
	return head;
}

//插入函数
struct Student *insert(struct Student **stu, int m, char direc, struct Student *ins)
{
	struct Student *p, *head;
	for (p=*stu, head=p; p!=NULL; p=p->next)
	{
		if (p->num==m)
		{
			if (direc=='F')
			{
				if (p==head)//若为第一个结构体数组 
				{
					ins->next=p;
					ins->prev=NULL;
					head->prev=ins;
					head=ins;
				}
				else
				{
					ins->prev=p->prev;
					p->prev->next=ins;
					ins->next=p;
					p->prev=ins;
				}
			}
			else if (direc=='B')
			{
				if (p->next==NULL)//若为最后一个结构体数组 
				{
					p->next=ins;
					ins->next=NULL;
					ins->prev=p;
				}
				else
				{
					ins->next=p->next;
					p->next=ins;
					ins->prev=p;
				}
			}
		}
	}
	return head;//返回值为head 
}

//输出函数
void print(struct Student *stu)
{
	struct Student *p;
	printf("Output Result:\n");
	for (p=stu; p!=NULL; p=p->next)
	{
		printf("%d %.2f\n", p->num, p->score);
	}
}

在VS2019下,需将源文件的scanf做些修改:

#include <stdio.h>
#include <stdlib.h>

struct Student
{                       //声明结构体(双向链表结构体)
	int num;
	float score;
	struct Student* prev;
	struct Student* next;
};

struct Student* input();                     //声明输入函数
struct Student* insert(struct Student** stu, int m, char direc, struct Student* ins);   //声明插入函数
void print(struct Student* stu);             //声明输出函数

int main()
{
	struct Student* stud, in, * inser;        //定义结构体指针,插入的结构体变量,指向插入结构体变量的指针
	int insert_num;                   //定义要插入的结点学号
	char dir;                         //定义前插后插的方向变量
	stud = input();                     //调用输入函数
	print(stud);                      //输出全部数据
	printf("Please enter insert student info: ");      //输入要插入的学生数据(学号和成绩)
	scanf_s("%d %f", &in.num, &in.score);
	getchar();
	inser = &in;                        //结构体变量指针指向in
	printf("Please enter insert num: ");               //输入要插入哪个学号
	scanf_s("%d", &insert_num);
	getchar();
	printf("Please enter F or B: ");                   //输入是要插入学号前还是后,F是前插,B是后插。
	scanf_s("%c", &dir, (unsigned int)sizeof(char));
	getchar();
	stud = insert(&stud, insert_num, dir, inser);             //调用插入函数,并把返回值head赋值给stud 
	print(stud);
	return 0;
}

//输入函数
struct Student* input()
{
	struct Student* p1, * p2, * head;
	int n = 0;
	p1 = p2 = (struct Student*)malloc(sizeof(struct Student));
	printf("Please enter No.%d student info: ", n + 1);
	scanf_s("%d %f", &p1->num, &p1->score);
	getchar();
	head = NULL;
	while (p1->num != 0)
	{
		n++;
		if (n == 1)
		{
			head = p1;
			p1->prev = NULL;
		}
		else
		{
			p2->next = p1;
			p1->prev = p2;
		}
		p2 = p1;
		p1 = (struct Student*)malloc(sizeof(struct Student));
		printf("Please enter No.%d student info: ", n + 1);
		scanf_s("%d %f", &p1->num, &p1->score);
		getchar();
	}
	p2->next = NULL;
	return head;
}

//插入函数
struct Student* insert(struct Student** stu, int m, char direc, struct Student* ins)
{
	struct Student* p, * head;
	for (p = *stu, head = p; p != NULL; p = p->next)
	{
		if (p->num == m)
		{
			if (direc == 'F')
			{
				if (p == head)//若为第一个结构体数组 
				{
					ins->next = p;
					ins->prev = NULL;
					head->prev = ins;
					head = ins;
				}
				else
				{
					ins->prev = p->prev;
					p->prev->next = ins;
					ins->next = p;
					p->prev = ins;
				}
			}
			else if (direc == 'B')
			{
				if (p->next == NULL)//若为最后一个结构体数组 
				{
					p->next = ins;
					ins->next = NULL;
					ins->prev = p;
				}
				else
				{
					ins->next = p->next;
					p->next = ins;
					ins->prev = p;
				}
			}
		}
	}
	return head;//返回值为head 
}

//输出函数
void print(struct Student* stu)
{
	struct Student* p;
	printf("Output Result:\n");
	for (p = stu; p != NULL; p = p->next)
	{
		printf("%d %.2f\n", p->num, p->score);
	}
}

方法二:

#include <stdio.h>
#include <stdlib.h>

struct Student
{                       //声明结构体(双向链表结构体)
	int num;
	float score;
	struct Student *prev;
	struct Student *next;
};

struct Student *input();                     //声明输入函数
void insert(struct Student **stu, int m, char direc, struct Student *ins);   //声明插入函数
void print(struct Student *stu);             //声明输出函数

int main()
{
	struct Student *stud, in, *inser;        //定义结构体指针,插入的结构体变量,指向插入结构体变量的指针
	int insert_num;                   //定义要插入的结点学号
	char dir;                         //定义前插后插的方向变量
	stud=input();                     //调用输入函数
	print(stud);                      //输出全部数据
	printf("Please enter insert student info: ");      //输入要插入的学生数据(学号和成绩)
	scanf("%d %f", &in.num, &in.score);
	getchar();
	inser=&in;                        //结构体变量指针指向in
	printf("Please enter insert num: ");               //输入要插入哪个学号
	scanf("%d", &insert_num);
	getchar();
	printf("Please enter F or B: ");                   //输入是要插入学号前还是后,F是前插,B是后插。
	scanf("%c", &dir);
	getchar();
	insert(&stud, insert_num, dir, inser);             //调用插入函数
	print(stud);
	return 0;
}

//输入函数
struct Student *input()
{
	struct Student *p1, *p2, *head;
	int n=0;
	p1=p2=(struct Student*)malloc(sizeof(struct Student));
	printf("Please enter No.%d student info: ", n+1);
	scanf("%d %f", &p1->num, &p1->score);
	getchar();
	head=NULL;
	while (p1->num!=0)
	{
		n++;
		if (n==1)
		{
			head=p1;
			p1->prev=NULL;
		}
		else
		{
			p2->next=p1;
			p1->prev=p2;
		}
		p2=p1;
		p1=(struct Student*)malloc(sizeof(struct Student));
		printf("Please enter No.%d student info: ", n+1);
		scanf("%d %f", &p1->num, &p1->score);
		getchar();
	}
	p2->next=NULL;
	return head;
}

//插入函数
void insert(struct Student **stu, int m, char direc, struct Student *ins)
{
	struct Student *p, *head, *front=NULL, *back=NULL;
	for (head=*stu, p=head; p!=NULL; p=p->next) 
	{
		if (p->num==m) 
		{
			if (direc=='F') 
			{
				front=p->prev;
				back=p;
			}
			else if (direc=='B') 
			{
				front=p;
				back=p->next;
			}
			if(head==back)
				head=ins;
			if(front!=NULL)
				front->next=ins;
			if(back!=NULL)
				back->prev=ins;
			ins->prev=front;
			ins->next=back;
		}
	}
	*stu=head;//因为stu指向stud,所以把head赋值给del函数里的*stu就是赋值给主函数main的stud
}

//输出函数
void print(struct Student *stu)
{
	struct Student *p;
	printf("Output Result:\n");
	for (p=stu; p!=NULL; p=p->next)
	{
		printf("%d %.2f\n", p->num, p->score);
	}
}

在VS2019下,需将源文件的scanf做些修改:

#include <stdio.h>
#include <stdlib.h>

struct Student
{                       //声明结构体(双向链表结构体)
	int num;
	float score;
	struct Student* prev;
	struct Student* next;
};

struct Student* input();                     //声明输入函数
void insert(struct Student** stu, int m, char direc, struct Student* ins);   //声明插入函数
void print(struct Student* stu);             //声明输出函数

int main()
{
	struct Student* stud, in, * inser;        //定义结构体指针,插入的结构体变量,指向插入结构体变量的指针
	int insert_num;                   //定义要插入的结点学号
	char dir;                         //定义前插后插的方向变量
	stud = input();                     //调用输入函数
	print(stud);                      //输出全部数据
	printf("Please enter insert student info: ");      //输入要插入的学生数据(学号和成绩)
	scanf_s("%d %f", &in.num, &in.score);
	getchar();
	inser = &in;                        //结构体变量指针指向in
	printf("Please enter insert num: ");               //输入要插入哪个学号
	scanf_s("%d", &insert_num);
	getchar();
	printf("Please enter F or B: ");                   //输入是要插入学号前还是后,F是前插,B是后插。
	scanf_s("%c", &dir, (unsigned int)sizeof(char));
	getchar();
	insert(&stud, insert_num, dir, inser);             //调用插入函数
	print(stud);
	return 0;
}

//输入函数
struct Student* input()
{
	struct Student* p1, * p2, * head;
	int n = 0;
	p1 = p2 = (struct Student*)malloc(sizeof(struct Student));
	printf("Please enter No.%d student info: ", n + 1);
	scanf_s("%d %f", &p1->num, &p1->score);
	getchar();
	head = NULL;
	while (p1->num != 0)
	{
		n++;
		if (n == 1)
		{
			head = p1;
			p1->prev = NULL;
		}
		else
		{
			p2->next = p1;
			p1->prev = p2;
		}
		p2 = p1;
		p1 = (struct Student*)malloc(sizeof(struct Student));
		printf("Please enter No.%d student info: ", n + 1);
		scanf_s("%d %f", &p1->num, &p1->score);
		getchar();
	}
	p2->next = NULL;
	return head;
}

//插入函数
void insert(struct Student** stu, int m, char direc, struct Student* ins)
{
	struct Student* p, * head, * front=NULL, * back=NULL;
	for (head = *stu, p = head; p != NULL; p = p->next)
	{
		if (p->num == m)
		{
			if (direc == 'F')
			{
				front = p->prev;
				back = p;
			}
			else if (direc == 'B')
			{
				front = p;
				back = p->next;
			}
			if (head == back)
				head = ins;
			if (front != NULL)
				front->next = ins;
			if (back != NULL)
				back->prev = ins;
			ins->prev = front;
			ins->next = back;
		}
	}
	*stu = head;//因为stu指向stud,所以把head赋值给del函数里的*stu就是赋值给主函数main的stud
}

//输出函数
void print(struct Student* stu)
{
	struct Student* p;
	printf("Output Result:\n");
	for (p = stu; p != NULL; p = p->next)
	{
		printf("%d %.2f\n", p->num, p->score);
	}
}

方法三:

#include <stdio.h>
#include <stdlib.h>

struct Student
{                       //声明结构体(双向链表结构体)
	int num;
	float score;
	struct Student *prev;
	struct Student *next;
};

struct Student *input();                     //声明输入函数
struct Student *insert(struct Student **stu, int m, char direc, struct Student *ins);   //声明插入函数
void print(struct Student *stu);             //声明输出函数

int main()
{
	struct Student *stud, in, *inser;        //定义结构体指针,插入的结构体变量,指向插入结构体变量的指针
	int insert_num;                   //定义要插入的结点学号
	char dir;                         //定义前插后插的方向变量
	stud=input();                     //调用输入函数
	print(stud);                      //输出全部数据
	printf("Please enter insert student info: ");      //输入要插入的学生数据(学号和成绩)
	scanf("%d %f", &in.num, &in.score);
	getchar();
	inser=&in;                        //结构体变量指针指向in
	printf("Please enter insert num: ");               //输入要插入哪个学号
	scanf("%d", &insert_num);
	getchar();
	printf("Please enter F or B: ");                   //输入是要插入学号前还是后,F是前插,B是后插。
	scanf("%c", &dir);
	getchar();
	stud=insert(&stud, insert_num, dir, inser);             //调用插入函数,并把返回值head赋值给stud 
	print(stud);
	return 0;
}

//输入函数
struct Student *input()
{
	struct Student *p1, *p2, *head;
	int n=0;
	p1=p2=(struct Student*)malloc(sizeof(struct Student));
	printf("Please enter No.%d student info: ", n+1);
	scanf("%d %f", &p1->num, &p1->score);
	getchar();
	head=NULL;
	while (p1->num!=0)
	{
		n++;
		if (n==1)
		{
			head=p1;
			p1->prev=NULL;
		}
		else
		{
			p2->next=p1;
			p1->prev=p2;
		}
		p2=p1;
		p1=(struct Student*)malloc(sizeof(struct Student));
		printf("Please enter No.%d student info: ", n+1);
		scanf("%d %f", &p1->num, &p1->score);
		getchar();
	}
	p2->next=NULL;
	return head;
}

//插入函数
struct Student *insert(struct Student **stu, int m, char direc, struct Student *ins)
{
	struct Student *p, *head, *front=NULL, *back=NULL;
	for (head=*stu, p=head; p!=NULL; p=p->next) 
	{
		if (p->num==m) 
		{
			if (direc=='F') 
			{
				front=p->prev;
				back=p;
			}
			else if (direc=='B') 
			{
				front=p;
				back=p->next;
			}
			if(head==back)
				head=ins;
			if(front!=NULL)
				front->next=ins;
			if(back!=NULL)
				back->prev=ins;
			ins->prev=front;
			ins->next=back;
		}
	}
	return head;//返回值为head 
}

//输出函数
void print(struct Student *stu)
{
	struct Student *p;
	printf("Output Result:\n");
	for (p=stu; p!=NULL; p=p->next)
	{
		printf("%d %.2f\n", p->num, p->score);
	}
}

在VS2019下,需将源文件的scanf做些修改:

#include <stdio.h>
#include <stdlib.h>

struct Student
{                       //声明结构体(双向链表结构体)
	int num;
	float score;
	struct Student* prev;
	struct Student* next;
};

struct Student* input();                     //声明输入函数
struct Student* insert(struct Student** stu, int m, char direc, struct Student* ins);   //声明插入函数
void print(struct Student* stu);             //声明输出函数

int main()
{
	struct Student* stud, in, * inser;        //定义结构体指针,插入的结构体变量,指向插入结构体变量的指针
	int insert_num;                   //定义要插入的结点学号
	char dir;                         //定义前插后插的方向变量
	stud = input();                     //调用输入函数
	print(stud);                      //输出全部数据
	printf("Please enter insert student info: ");      //输入要插入的学生数据(学号和成绩)
	scanf_s("%d %f", &in.num, &in.score);
	getchar();
	inser = &in;                        //结构体变量指针指向in
	printf("Please enter insert num: ");               //输入要插入哪个学号
	scanf_s("%d", &insert_num);
	getchar();
	printf("Please enter F or B: ");                   //输入是要插入学号前还是后,F是前插,B是后插。
	scanf_s("%c", &dir, (unsigned int)sizeof(char));
	getchar();
	stud = insert(&stud, insert_num, dir, inser);             //调用插入函数,并把返回值head赋值给stud 
	print(stud);
	return 0;
}

//输入函数
struct Student* input()
{
	struct Student* p1, * p2, * head;
	int n = 0;
	p1 = p2 = (struct Student*)malloc(sizeof(struct Student));
	printf("Please enter No.%d student info: ", n + 1);
	scanf_s("%d %f", &p1->num, &p1->score);
	getchar();
	head = NULL;
	while (p1->num != 0)
	{
		n++;
		if (n == 1)
		{
			head = p1;
			p1->prev = NULL;
		}
		else
		{
			p2->next = p1;
			p1->prev = p2;
		}
		p2 = p1;
		p1 = (struct Student*)malloc(sizeof(struct Student));
		printf("Please enter No.%d student info: ", n + 1);
		scanf_s("%d %f", &p1->num, &p1->score);
		getchar();
	}
	p2->next = NULL;
	return head;
}

//插入函数
struct Student* insert(struct Student** stu, int m, char direc, struct Student* ins)
{
	struct Student* p, * head, * front=NULL, * back=NULL;
	for (head = *stu, p = head; p != NULL; p = p->next)
	{
		if (p->num == m)
		{
			if (direc == 'F')
			{
				front = p->prev;
				back = p;
			}
			else if (direc == 'B')
			{
				front = p;
				back = p->next;
			}
			if (head == back)
				head = ins;
			if (front != NULL)
				front->next = ins;
			if (back != NULL)
				back->prev = ins;
			ins->prev = front;
			ins->next = back;
		}
	}
	return head;//返回值为head 
}

//输出函数
void print(struct Student* stu)
{
	struct Student* p;
	printf("Output Result:\n");
	for (p = stu; p != NULL; p = p->next)
	{
		printf("%d %.2f\n", p->num, p->score);
	}
}

方法四:

#include <stdio.h>
#include <stdlib.h>

struct Student
{                       //声明结构体(双向链表结构体)
	int num;
	float score;
	struct Student *prev;
	struct Student *next;
};

struct Student *input();                     //声明输入函数
void insert(struct Student **stu, int m, char direc, struct Student *ins);   //声明插入函数
void print(struct Student *stu);             //声明输出函数

int main()
{
	struct Student *stud, in, *inser;        //定义结构体指针,插入的结构体变量,指向插入结构体变量的指针
	int insert_num;                   //定义要插入的结点学号
	char dir;                         //定义前插后插的方向变量
	stud=input();                     //调用输入函数
	print(stud);                      //输出全部数据
	printf("Please enter insert student info: ");      //输入要插入的学生数据(学号和成绩)
	scanf("%d %f", &in.num, &in.score);
	getchar();
	inser=&in;                        //结构体变量指针指向in
	printf("Please enter insert num: ");               //输入要插入哪个学号
	scanf("%d", &insert_num);
	getchar();
	printf("Please enter F or B: ");                   //输入是要插入学号前还是后,F是前插,B是后插。
	scanf("%c", &dir);
	getchar();
	insert(&stud, insert_num, dir, inser);             //调用插入函数
	print(stud);
	return 0;
}

//输入函数
struct Student *input()
{
	struct Student *p1, *p2, *head;
	int n=0;
	p1=p2=(struct Student*)malloc(sizeof(struct Student));
	printf("Please enter No.%d student info: ", n+1);
	scanf("%d %f", &p1->num, &p1->score);
	getchar();
	head=NULL;
	while (p1->num!=0)
	{
		n++;
		if (n==1)
		{
			head=p1;
			p1->prev=NULL;
		}
		else
		{
			p2->next=p1;
			p1->prev=p2;
		}
		p2=p1;
		p1=(struct Student*)malloc(sizeof(struct Student));
		printf("Please enter No.%d student info: ", n+1);
		scanf("%d %f", &p1->num, &p1->score);
		getchar();
	}
	p2->next=NULL;
	return head;
}

//插入函数
void insert(struct Student **stu, int m, char direc, struct Student *ins)
{
	struct Student *p, *head, *front=NULL, *back=NULL;
	for (head=*stu, p=head; p!=NULL; p=p->next) 
	{
		if (p->num==m) 
		{
			if (direc=='F') 
			{
				front=p->prev;
				back=p;
			}
			else if (direc=='B') 
			{
				front=p;
				back=p->next;
			}
			if(head==back)
				head=ins;
			if(front!=NULL)
				front->next=ins;
			if(back!=NULL)
				back->prev=ins;
			ins->prev=front;
			ins->next=back;
		}
	}
	*stu=head;//因为stu指向stud,所以把head赋值给del函数里的*stu就是赋值给主函数main的stud
}

//输出函数
void print(struct Student *stu)
{
	struct Student *p;
	printf("Output Result:\n");
	for (p=stu; p!=NULL; p=p->next)
	{
		printf("%d %.2f\n", p->num, p->score);
	}
}

在VS2019下,需将源文件的scanf做些修改:

#include <stdio.h>
#include <stdlib.h>

struct Student
{                       //声明结构体(双向链表结构体)
	int num;
	float score;
	struct Student* prev;
	struct Student* next;
};

struct Student* input();                     //声明输入函数
void insert(struct Student** stu, int m, char direc, struct Student* ins);   //声明插入函数
void print(struct Student* stu);             //声明输出函数

int main()
{
	struct Student* stud, in, * inser;        //定义结构体指针,插入的结构体变量,指向插入结构体变量的指针
	int insert_num;                   //定义要插入的结点学号
	char dir;                         //定义前插后插的方向变量
	stud = input();                     //调用输入函数
	print(stud);                      //输出全部数据
	printf("Please enter insert student info: ");      //输入要插入的学生数据(学号和成绩)
	scanf_s("%d %f", &in.num, &in.score);
	getchar();
	inser = &in;                        //结构体变量指针指向in
	printf("Please enter insert num: ");               //输入要插入哪个学号
	scanf_s("%d", &insert_num);
	getchar();
	printf("Please enter F or B: ");                   //输入是要插入学号前还是后,F是前插,B是后插。
	scanf_s("%c", &dir, (unsigned int)sizeof(char));
	getchar();
	insert(&stud, insert_num, dir, inser);             //调用插入函数
	print(stud);
	return 0;
}

//输入函数
struct Student* input()
{
	struct Student* p1, * p2, * head;
	int n = 0;
	p1 = p2 = (struct Student*)malloc(sizeof(struct Student));
	printf("Please enter No.%d student info: ", n + 1);
	scanf_s("%d %f", &p1->num, &p1->score);
	getchar();
	head = NULL;
	while (p1->num != 0)
	{
		n++;
		if (n == 1)
		{
			head = p1;
			p1->prev = NULL;
		}
		else
		{
			p2->next = p1;
			p1->prev = p2;
		}
		p2 = p1;
		p1 = (struct Student*)malloc(sizeof(struct Student));
		printf("Please enter No.%d student info: ", n + 1);
		scanf_s("%d %f", &p1->num, &p1->score);
		getchar();
	}
	p2->next = NULL;
	return head;
}

//插入函数
void insert(struct Student** stu, int m, char direc, struct Student* ins)
{
	struct Student* p, * head, * front = NULL, * back = NULL;
	for (head = *stu, p = head; p != NULL; p = p->next)
	{
		if (p->num == m)
		{
			if (direc == 'F')
			{
				front = p->prev;
				back = p;
			}
			else if (direc == 'B')
			{
				front = p;
				back = p->next;
			}
			if (head == back)
				head = ins;
			if (front != NULL)
				front->next = ins;
			if (back != NULL)
				back->prev = ins;
			ins->prev = front;
			ins->next = back;
		}
	}
	*stu = head;//因为stu指向stud,所以把head赋值给del函数里的*stu就是赋值给主函数main的stud
}

//输出函数
void print(struct Student* stu)
{
	struct Student* p;
	printf("Output Result:\n");
	for (p = stu; p != NULL; p = p->next)
	{
		printf("%d %.2f\n", p->num, p->score);
	}
}

方法五:

#include <stdio.h>
#include <stdlib.h>

struct Student
{                       //声明结构体(双向链表结构体)
	int num;
	float score;
	struct Student *prev;
	struct Student *next;
};

struct Student *input();                     //声明输入函数
void insert(struct Student **stu, int m, char direc, struct Student *ins);   //声明插入函数
void print(struct Student *stu);             //声明输出函数

int main()
{
	struct Student *stud, in, *inser;        //定义结构体指针,插入的结构体变量,指向插入结构体变量的指针
	int insert_num;                   //定义要插入的结点学号
	char dir;                         //定义前插后插的方向变量
	stud=input();                     //调用输入函数
	print(stud);                      //输出全部数据
	printf("Please enter insert student info: ");      //输入要插入的学生数据(学号和成绩)
	scanf("%d %f", &in.num, &in.score);
	getchar();
	inser=&in;                        //结构体变量指针指向in
	printf("Please enter insert num: ");               //输入要插入哪个学号
	scanf("%d", &insert_num);
	getchar();
	printf("Please enter F or B: ");                   //输入是要插入学号前还是后,F是前插,B是后插。
	scanf("%c", &dir);
	getchar();
	insert(&stud, insert_num, dir, inser);             //调用插入函数
	print(stud);
	return 0;
}

//输入函数
struct Student *input()
{
	struct Student *p1, *p2, *head;
	int n=0;
	p1=p2=(struct Student*)malloc(sizeof(struct Student));
	printf("Please enter No.%d student info: ", n+1);
	scanf("%d %f", &p1->num, &p1->score);
	getchar();
	head=NULL;
	while (p1->num!=0)
	{
		n++;
		if (n==1)
		{
			head=p1;
			p1->prev=NULL;
		}
		else
		{
			p2->next=p1;
			p1->prev=p2;
		}
		p2=p1;
		p1=(struct Student*)malloc(sizeof(struct Student));
		printf("Please enter No.%d student info: ", n+1);
		scanf("%d %f", &p1->num, &p1->score);
		getchar();
	}
	p2->next=NULL;
	return head;
}

//插入函数
void insert(struct Student **head, int m, char direc, struct Student *ins)//head指向stud,修改*head就是修改stud 
{
	struct Student *p, *front=NULL, *back=NULL;
	for (p=*head; p!=NULL; p=p->next) 
	{
		if (p->num==m) 
		{
			if (direc=='F') 
			{
				front=p->prev;
				back=p;
			}
			else if (direc=='B') 
			{
				front=p;
				back=p->next;
			}
			if(*head==back)
				*head=ins;
			if(front!=NULL)
				front->next=ins;
			if(back!=NULL)
				back->prev=ins;
			ins->prev=front;
			ins->next=back;
		}
	}
}

//输出函数
void print(struct Student *stu)
{
	struct Student *p;
	printf("Output Result:\n");
	for (p=stu; p!=NULL; p=p->next)
	{
		printf("%d %.2f\n", p->num, p->score);
	}
}

在VS2019下,需将源文件的scanf做些修改:

#include <stdio.h>
#include <stdlib.h>

struct Student
{                       //声明结构体(双向链表结构体)
	int num;
	float score;
	struct Student* prev;
	struct Student* next;
};

struct Student* input();                     //声明输入函数
void insert(struct Student** stu, int m, char direc, struct Student* ins);   //声明插入函数
void print(struct Student* stu);             //声明输出函数

int main()
{
	struct Student* stud, in, * inser;        //定义结构体指针,插入的结构体变量,指向插入结构体变量的指针
	int insert_num;                   //定义要插入的结点学号
	char dir;                         //定义前插后插的方向变量
	stud = input();                     //调用输入函数
	print(stud);                      //输出全部数据
	printf("Please enter insert student info: ");      //输入要插入的学生数据(学号和成绩)
	scanf_s("%d %f", &in.num, &in.score);
	getchar();
	inser = &in;                        //结构体变量指针指向in
	printf("Please enter insert num: ");               //输入要插入哪个学号
	scanf_s("%d", &insert_num);
	getchar();
	printf("Please enter F or B: ");                   //输入是要插入学号前还是后,F是前插,B是后插。
	scanf_s("%c", &dir, (unsigned int)sizeof(char));
	getchar();
	insert(&stud, insert_num, dir, inser);             //调用插入函数
	print(stud);
	return 0;
}

//输入函数
struct Student* input()
{
	struct Student* p1, * p2, * head;
	int n = 0;
	p1 = p2 = (struct Student*)malloc(sizeof(struct Student));
	printf("Please enter No.%d student info: ", n + 1);
	scanf_s("%d %f", &p1->num, &p1->score);
	getchar();
	head = NULL;
	while (p1->num != 0)
	{
		n++;
		if (n == 1)
		{
			head = p1;
			p1->prev = NULL;
		}
		else
		{
			p2->next = p1;
			p1->prev = p2;
		}
		p2 = p1;
		p1 = (struct Student*)malloc(sizeof(struct Student));
		printf("Please enter No.%d student info: ", n + 1);
		scanf_s("%d %f", &p1->num, &p1->score);
		getchar();
	}
	p2->next = NULL;
	return head;
}

//插入函数
void insert(struct Student** head, int m, char direc, struct Student* ins)//head指向stud,修改*head就是修改stud 
{
	struct Student* p, * front = NULL, * back = NULL;
	for (p = *head; p != NULL; p = p->next)
	{
		if (p->num == m)
		{
			if (direc == 'F')
			{
				front = p->prev;
				back = p;
			}
			else if (direc == 'B')
			{
				front = p;
				back = p->next;
			}
			if (*head == back)
				*head = ins;
			if (front != NULL)
				front->next = ins;
			if (back != NULL)
				back->prev = ins;
			ins->prev = front;
			ins->next = back;
		}
	}
}

//输出函数
void print(struct Student* stu)
{
	struct Student* p;
	printf("Output Result:\n");
	for (p = stu; p != NULL; p = p->next)
	{
		printf("%d %.2f\n", p->num, p->score);
	}
}
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值