C语言——结构体链表(附加)

一、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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的C语言示例代码,用于创建并操作结构体链表: ```c #include <stdio.h> #include <stdlib.h> // 定义结构体 struct Node { int data; struct Node* next; }; // 创建节点函数 struct Node* createNode(int data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); if (newNode == NULL) { printf("内存分配失败\n"); exit(1); } newNode->data = data; newNode->next = NULL; return newNode; } // 插入节点函数 void insertNode(struct Node** head, int data) { struct Node* newNode = createNode(data); if (*head == NULL) { *head = newNode; } else { struct Node* temp = *head; while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; } } // 遍历链表函数 void traverseList(struct Node* head) { struct Node* temp = head; while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } } // 主函数 int main() { struct Node* head = NULL; // 链表指针 // 插入节点 insertNode(&head, 1); insertNode(&head, 2); insertNode(&head, 3); // 遍历链表并打印节点数据 traverseList(head); return 0; } ``` 上述代码创建了一个简单的结构体链表,包括了创建节点、插入节点和遍历链表的函数。在主函数中,我们创建了一个头指针 `head`,然后通过调用 `insertNode` 函数插入一些节点,最后使用 `traverseList` 函数遍历链表并打印节点的数据。 请注意,在实际应用中,需要根据具体需求进行相应的修改和扩展,例如删除节点、按特定顺序插入节点等操作。此外,为了确保内存的正确释放,还需要实现删除节点时的内存释放操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值