一、NO.10我们学习的简单的链表现在我们对其进行优化。
二、增
1.1、大致
1.2、链表的输出
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define LEN sizeof(struct student) //student结构的大小
struct student *creat(); //创建链表
void print(struct student *head); //打印链表
struct student{
int num;
float score;
struct student *next;
};
int n; //全局变量,用来记录存放了多少数据
void main(){
struct student *stu;
stu = creat();
print(stu);
printf("\n\n");
system("pause");
}
struct student *creat(){
struct student *head;
struct student *p1,*p2;
p1 = p2 = (struct student *)malloc(LEN); //LEN student结构的大小
printf("Please enter the num:");
scanf("%d",&p1->num);
printf("Please enter the score:");
scanf("%f",&p1->score);
head = NULL;
n = 0;
while(0 != p1->num){
n++;
if(1 == n){
head = p1;
}else{
p2->next = p1;
}
p2 = p1;
p1 = (struct student *)malloc(LEN);
printf("\nPlease enter the num:");
scanf("%d",&p1->num);
printf("Please enter the score:");
scanf("%f",&p1->score);
}
p2->next = NULL;
return head;
}
void print(struct student *head){
struct student *p;
printf("\nThere are %d records!\n\n",n);
p = head;
if(NULL != head){
do{
printf("学号为 %d 的成绩是:%f\n",p->num,p->score);
p = p->next;
}while(NULL != p);
}
}
二、对链表的删除操作
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define LEN sizeof(struct student) //student结构的大小
struct student *creat(); //创建链表
//del函数用于删除结点,*head即链表的头指针,num是要删除的结点num。
struct student *del( struct student *head,int num);
void print(struct student *head); //打印链表
struct student{
int num;
float score;
struct student *next;
};
int n; //全局变量,用来记录存放了多少数据
void main(){
struct student *stu, *p;
int n;
stu = creat();
p = stu;
print(p);
printf("Please enter the num to delete: "); //删除结点
scanf("%d",&n);
print(del(p,n));
printf("\n\n");
system("pause");
}
//创建:
struct student *creat(){
struct student *head;
struct student *p1,*p2;
p1 = p2 = (struct student *)malloc(LEN); //LEN student结构的大小
printf("Please enter the num:");
scanf("%d",&p1->num);
printf("Please enter the score:");
scanf("%f",&p1->score);
head = NULL;
n = 0;
while(0 != p1->num){
n++;
if(1 == n){
head = p1;
}else{
p2->next = p1;
}
p2 = p1;
p1 = (struct student *)malloc(LEN);
printf("\nPlease enter the num:");
scanf("%d",&p1->num);
printf("Please enter the score:");
scanf("%f",&p1->score);
}
p2->next = NULL;
return head;
}
//打印:
void print(struct student *head){
struct student *p;
printf("\nThere are %d records!\n\n",n);
p = head;
if(NULL != head){
do{
printf("学号为 %d 的成绩是:%f\n",p->num,p->score);
p = p->next;
}while(NULL != p);
}
}
//删除:
struct student *del( struct student *head,int num){
struct student *p1,*p2;
if(NULL == head){ //如果头结点指向NULL,则这是一个空链表
printf("\nThis list is null!\n");
goto END;
}
p1 = head;
while(p1->num != num && p1->next != NULL){
p2 = p1;
p1 = p1->next;
}
if(num == p1->num) {
if(p1 == head){
head = p1->next;
}else{
p2->next = p1->next;
}
printf("\nDelete No: %d succeed!\n",num);
n = n-1;
}else{
printf("%d not been found!\n",num);
}
END:
return head;
}
三、对链表的插入操作
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define LEN sizeof(struct student) //student结构的大小
struct student *creat(); //创建链表
//del函数用于删除结点,*head即链表的头指针,num是要删除的结点num。
struct student *del( struct student *head,int num);
struct student *insert(struct student *head,struct student *stu_2);//第一个参数:需要被插入的链表
//第二个参数待插入的结构的地址
void print(struct student *head); //打印链表
struct student{
int num;
float score;
struct student *next;
};
int n; //全局变量,用来记录存放了多少数据
void main(){
struct student *stu, *p,stu_2;
int n;
stu = creat();
p = stu;
print(p);
printf("Please enter the num to delete: "); //删除结点
scanf("%d",&n);
print(del(p,n));
printf("Please enter the num to insert: ");
scanf("%d",&stu_2.num);
printf("Please enter the score: ");
scanf("%f",&stu_2.score);
p = insert(stu,&stu_2);
print(p);
printf("\n\n");
system("pause");
}
//创建:
struct student *creat(){
struct student *head;
struct student *p1,*p2;
p1 = p2 = (struct student *)malloc(LEN); //LEN student结构的大小
printf("Please enter the num:");
scanf("%d",&p1->num);
printf("Please enter the score:");
scanf("%f",&p1->score);
head = NULL;
n = 0;
while(0 != p1->num){
n++;
if(1 == n){
head = p1;
}else{
p2->next = p1;
}
p2 = p1;
p1 = (struct student *)malloc(LEN);
printf("\nPlease enter the num:");
scanf("%d",&p1->num);
printf("Please enter the score:");
scanf("%f",&p1->score);
}
p2->next = NULL;
return head;
}
//打印:
void print(struct student *head){
struct student *p;
printf("\nThere are %d records!\n\n",n);
p = head;
if(NULL != head){
do{
printf("学号为 %d 的成绩是:%f\n",p->num,p->score);
p = p->next;
}while(NULL != p);
}
}
//删除:
struct student *del( struct student *head,int num){
struct student *p1,*p2;
if(NULL == head){ //如果头结点指向NULL,则这是一个空链表
printf("\nThis list is null!\n");
goto END;
}
p1 = head;
while(p1->num != num && p1->next != NULL){
p2 = p1;
p1 = p1->next;
}
if(num == p1->num) {
if(p1 == head){
head = p1->next;
}else{
p2->next = p1->next;
}
printf("\nDelete No: %d succeed!\n",num);
n = n-1;
}else{
printf("%d not been found!\n",num);
}
END:
return head;
}
//插入
struct student *insert(struct student *head,struct student *stu_2){
struct student *p0,*p1,*p2;
p1 = head;
p0 = stu_2;
if(NULL == head){ //判断是不是空列表
head = p0;
p0->next = NULL;
}else{
while((p0->num > p1->num) && (p1 ->next != NULL)){ //两种情况
p2 = p1;
p1 = p1->next;
}
if(p0->num <= p1->num){ //p1是头结点,插入头部
if(head == p1){
head = p0;
}
else{ //普通情况,插入中间
p2->next =p0;
}
p0-> next =p1;
}
else{ //p0的num最大,插入到末端
p1->next = p0;
p0->next = NULL;
}
}
n = n+1;
return head;
}