C语言——链表

//链表的操作
#include<stdio.h>
#include<malloc.h>
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
	long num;
	float score;
	struct student *next;
};//结点
int n;//存放结点个数
struct student *creat()//创建链表
{
	struct student *head;//头指针
	struct student *p1,*p2;
	n=0;
	head=NULL;
	p1=p2=(struct student*)malloc(LEN);//分配存储空间
	printf("input num,score:\n");
	scanf("%ld,%f",&p1->num,&p1->score);
	while(p1->num!=0)
	{
		n=n+1;
		if(n==1)//第一个结点
			head=p1;
		else
		{
			p2->next=p1;
			p2=p1;
		}
		p1=(struct student*)malloc(LEN);
		printf("input num&&score:\n");
		scanf("%ld,%f",&p1->num,&p1->score);
	}
	p2->next=NULL;
	return head;//返回头指针
}
void print(struct student *head)//链表输出
{
	struct student*p;
	printf("\nNow,these %d records are:\n",n);
	p=head;
	if(head!=NULL)
		while(p!=NULL)
		{
			printf("%ld\t%5.2f\n",p->num,p->score);
			p=p->next;
		}
}
struct student *del(struct student *head,long num)//链表的删除操作
{
	struct student *p1,*p2;
	if(head==NULL)//空链表
	{
		printf("\nListLink is null\n");
		goto end;
	}
	p1=head;
	while(num!=p1->num&&p1->next!=NULL)//查找要删除的结点,p1指向要删除的结点,p2指向要删除的结点的前一个结点
	{
		p2=p1;
		p1=p1->next;
	}
	if(num==p1->num)
	{
		if(p1==head)//要删除的结点是第一个结点
			head=p1->next;
		else
			p2->next=p1->next;
		printf("delete %ld is succeed\n",num);
		n=n-1;
	}
	else
		printf("%ld not been found!\n",num);
end:
	return head;
}
struct student *insert(struct student *head,struct student *stud)//链表的插入操作
{
	struct student *p0,*p1,*p2;//p1存放插入位置的后一个结点,p2存放插入位置的前一个结点
	p1=head;
	p0=stud;//要插入的结点
	if(head==NULL)//若链表为空链表
	{
		head=p0;
		p0->next=NULL;
	}
	else
	{
		while((p0->num>p1->num)&&(p1->next!=NULL))//查找要插入的位置
		{
			p2=p1;
			p1=p1->next;
		}
		if(p0->num<=p1->num)
		{
			if(head==p1)//插入位置为第一个结点,表头
				head=p0;
			else
				p2->next=p0;
			p0->next=p1;
		}
		else
		{
			p1->next=p0;//插入位置为表尾,
			p0->next=NULL;
		}
	}
	n=n+1;
	return head;
}
void main()
{
	struct student *head,*stu;
	long del_num;
	printf("input records:\n");
	head=creat();//创建链表
	print(head);

	printf("\ninput the delete number:");
	scanf("%ld",&del_num);
	while(del_num!=0)//删除结点
	{
		head=del(head,del_num);
		print(head);
		printf("\ninput the delete number:");
		scanf("%ld",&del_num);
	}
	printf("\ninput insert record:");
	stu=(struct student*)malloc(LEN);
	scanf("%ld,%f",&stu->num,&stu->score);
	while(stu->num!=0)//插入结点
	{
		head=insert(head,stu);
		print(head);
		printf("\ninput insert record:");
		stu=(struct student*)malloc(LEN);
		scanf("%ld,%f",&stu->num,&stu->score);
	}
}

时间: 2024-10-26 01:21:35

C语言——链表的相关文章

C语言-链表

单向链表:结构体非常适合链表结构,链表的组成:head指针.数据块节点指针p->nest.结束指针NULL. 链表操作:需要首先找到表头head指针.链表的操作包括动态链表的创建.顺序输出.删除节点.插入节点的操作. 动态存储操作函数:(ANSI规则返回的指针类型为void*,早期的为字符型指针) 分配一个块:void *malloc(unsigned int size)  //分配成功则返回指向起始地址的指针void * 分配多个块:void *calloc(unsigned n,unsign

关于c语言链表的操作

这几天又讲到链表了,但是又忘记了,所以重新把关于链表的建链表,对链表进行排序,然后是删除,插入,以及遍历等功能..但是最近要考试了,所以没有写成菜单的形式..等考试完了,在进行补充吧.. 代码如下... #include<stdio.h> #include<stdlib.h> #include<string.h> struct node { int data; struct node *next; }; int main() { /*建立链表操作*/ int n,x,p

C语言链表实例--玩转链表

下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 name,性别 sex 和成绩 score 等.另一个域为指针域,存放下一结点的首地址.链表中的每一个结点都是同一种结构类型. 指针域: 即在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域. 在第一个结点的指针域内存入第二个结点的首地址,在第二个结点的指针域

c语言链表和指针的运用

在学习指针之前,首先要认识指针.指针是一个存储计算机内存地址的变量.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具体类型的变量地址,例如int.long和double.指针也可以是void类型.NULL指针和未初始化指针. 根据出现的位置不同,操作符 * 既可以用来声明一个指针变量,也可以用作指针的取值.当用在声明一个变量时,*表示这里声明了一个指针.其它情况用到*表示指针的取值.&是地址操作符,用来引用一个内存地址.通过在变量名字前使用&操作符,我们可以得到该变量的内存地址.

C语言链表的来源分析

C语言中的链表是重点,也是难点,而且意义非凡.对链表的的抽象和恐惧是源于对它的来龙去脉的不明白.所以很有必要对它的发展渊源做透彻分析. 链表的单位是节点,而节点源于复合数据类型:结构体: 节点和结构体的区别就是看是否有指针域,目的就是想找到下一个节点: 结构体形如: struct Ghost { char name[30]; int age; int height; char addr[30]; }; 节点形如: struct Ghost { char name[30]; int age; in

注释最全的C语言链表的增删改查

1 //这是C语言的写法,但会报错,原因是len(当前的节点长度) 2 //无法在insert(插入)和deleted(删除)之后改变 3 //不能使用delete是因为delete是C++中的一个运算符 4 //最终我把改程序用C++写了一遍,运用引用将len的真实值改变了 5 #include <stdio.h> 6 #include <stdlib.h> 7 typedef int ElementType; 8 typedef struct node { 9 ElementT

C语言链表

#define _CRT_SECURE_NO_WARNINGS #include "stdio.h" #include "stdlib.h" typedef struct _Teacher { int age; struct _Teacher *next; }Teacher; Teacher* create_teacher(); int print_teacher(Teacher * pHeader); int add_teacher(Teacher * pHead

C语言----------链表的简单操作

#include <stdio.h> #include <malloc.h> typedef struct node{ //定义节点类型 char data; //数据域 struct node *next; //指针域 }linklist; linklist* Create(){ //创建链表 char key; linklist *phead; //头指针 linklist *pnew; //新节点 linklist *pend; //尾指针 phead = (linklist

C语言链表的简单实用

// //  ViewController.m //  链表 // //  Created by 张凯泽 on 16/1/26. //  Copyright © 2016年 rytong_zkz. All rights reserved. // #import "ViewController.h" /* static 关键字的作用: (1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次, 因此其值在下次调用时仍维持上次的值: (2)在

C语言 链表排序

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <assert.h> 4 5 typedef struct node{ 6 int data; // 存放数据 7 struct node* next; // 下一节点 8 }ListNode; 9 10 extern int CSort(); 11 12 ListNode *root = NULL;// 13 14 int main(int argc, char