【数据结构.C】顺序表和单链表的增删查改

文章提供了C语言实现的顺序表(SqList)和单链表(LinkList)的基本操作,包括初始化、插入、删除、查找和打印等功能。通过示例代码展示了如何处理这两种数据结构,并提供了简单的用户交互界面供用户选择操作。
摘要由CSDN通过智能技术生成

宝子,你不点个赞吗?不评个论吗?不收个藏吗?

最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!

喵喵喵,你对我真的很重要。

目录

单链表增删查改

c1.h

sqlist.c

number.c

单链表的增删查改

 c1.h

stuscore.c


顺序表增删查改

c1.h

 #ifndef _C1_H_
 #define _C1_H_
  
 #include<string.h>
 #include<stdio.h> /* EOF(=^Z或F6),NULL */
 #include<stdlib.h> /* malloc()等 */
 #include<math.h> /* floor(),ceil(),abs() */
 
 /* 函数结果状态代码 */
 #define TRUE 1
 #define FALSE 0
 #define OK 1
 #define ERROR 0
 #define INFEASIBLE -1

 /* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */
 typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
 typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
 
 #endif

sqlist.c

#include"c1.h"
 #define MAXSIZE 100
typedef int ElemType;


typedef struct{
	ElemType *elem;   
	int length;   
}SqList; 

Status InitList_Sq(SqList *L);
int GetElem(SqList L,int i,ElemType *e);
int LocateElem(SqList L,ElemType e);
Status ListInsert_Sq(SqList *L,int i ,ElemType e);
Status ListDelete_Sq(SqList *L,int i);
void DestroyList(SqList *L);
void ClearList(SqList *L);
int GetLength(SqList L);
int IsEmpty(SqList L);



Status InitList_Sq(SqList *L)
{
	L->elem=(ElemType *)malloc(sizeof(ElemType)* MAXSIZE);   
    if(L->elem==NULL)
	exit(OVERFLOW);        
    L->length=0;				    
    return OK;
  }                  

    


int GetElem(SqList L,int i,ElemType *e)  
{
  if (i<1||i>L.length) 
  return ERROR;   
  *e=L.elem[i-1];   
  return OK;
}


int LocateElem(SqList L,ElemType e)
{
	int i;
  	for (i=0;i<=L.length-1;i++)
      	if (L.elem[i]==e) 
		return i+1;   
 	    return 0; 
}

Status ListInsert_Sq(SqList *L,int i ,ElemType e)  
{
		int j;
   if(i<1 || i>L->length+1) 
   return ERROR;	        
   if(L->length==MAXSIZE) 
   return ERROR;       
   for( j=L->length-1;j>=i-1;j-- ) 
         L->elem[j+1]=L->elem[j];  
    L->elem[i-1]=e;                     
    ++L->length;		     
    return OK;
}

Status ListDelete_Sq(SqList *L,int i)
{
	int j;
   if(i<1||i>L->length) 
   return ERROR;	 
   for (j=i;j<=L->length-1;j++)                   
	L->elem[j-1]=L->elem[j];   
   L->length--;           	                 
  return OK;
}
  
  
  
void DestroyList(SqList *L) 
{
  if (L->elem)  
  free(L->elem);   
}



void ClearList(SqList *L) 
{
   L->length=0;               
}



int GetLength(SqList L)  
{
   return L.length;             
}



int IsEmpty(SqList L) 
{
  if (L.length==0) 
  return OK;      
  else 
  return ERROR;
}

number.c

#include"sqlist.c"
void menu();
void PrintList(SqList L);
void DeleteAll(SqList* L,ElemType e);
void menu()
{
    printf("**顺序表功能选择界面**\n");
	printf("1.初始化顺序表\n"); 
	printf("2.插入\n"); 
	printf("3.批量输入\n"); 
	printf("4.输出\n");
	printf("5.删除第i个元素\n");
	printf("6.删除与值e相等的所有元素\n");
	printf("0.退出\n");
}
void PrintList(SqList L)
{
	int i;
	if(L.length==0)
	{
		printf("当前顺序表为空表!\n");
	 } 
	 else
	 {
	 	printf("顺序表的当前元素:");
		for(i=1;i<=L.length;i++)
		{
			printf("%d ",L.elem[i-1]);
		 } 
		 printf("\n");
	 }
}
void DeleteAll(SqList *L,ElemType e)
{
	int i,x,L_len;
	L_len=GetLength(*L);  
	for(i=1;i<=L_len;i++)
	{
		x=LocateElem(*L,e); 
		  if(x!=0)
			ListDelete_Sq(L,x); 
		  else
			break;	
	}
}
int main()
{
   	SqList L;
	ElemType e;
	int choose,temp,i,n;
	menu();
	while(1)
	{
	
		printf("\n请选择功能:");
		scanf("%d",&choose);
		switch(choose)
		{
			case  1:
				temp=InitList_Sq(&L);
				if(temp==OK)
				{
					printf("顺序表初始化成功!\n");
					printf("顺序表空间的起始化为:%x\n",L.elem);
					printf("顺序表的当前长度为:%d\n",L.length);
					printf("顺序表的当前最大容量为:%d\n",MAXSIZE);
				}
				else
				{
					printf("顺序表初始化失败!");
					return 0; 
				}
				break;
			case  2:
				printf("请输入要插入的元素位置:");
				scanf("%d",&i);
				printf("请输入要插入元素的值:");
				scanf("%d",&e);
				temp=ListInsert_Sq(&L,i,e);
				if(temp==OK)
				{
					printf("插入元素成功!\n");
					PrintList(L);
				 } 
				 else
				 printf("插入失败!\n");
				break;
			case  3:
				printf("请输入要插入元素的个数:");
				scanf("%d",&n);
				printf("请输入要插入的元素(用空格分隔):");
				for(i=1;i<=n;i++)
				{
					scanf("%d",&e);
					temp=ListInsert_Sq(&L,L.length+1,e);
					if(temp==ERROR)
					{
						printf("插入第%d个元素失败!\n",i);
						break;
					}
				 } 
				 if(i>n)
				 	printf("请输入元素成功!\n");
				 	PrintList(L);
				
				break;
			case  4:
				PrintList(L);
				break;
				break;
			case  5:
				printf("请输入要删除的元素位置:");
				scanf("%d",&i);
				ListDelete_Sq(&L,i);
				if(temp==ERROR)
				printf("删除失败!\n");
				else
				{
					printf("删除成功!\n");
					PrintList(L);
				 } 
				break;
			case  6:
				printf("请输入要删除的值:"); 
				scanf("%d",&e);
				DeleteAll(&L,e);
				PrintList(L);
				break;
			case  0:
				printf("退出系统\n");
				return 0;
			default:
				printf("输入错误,请重新输入!\n");	
				break;			
		}
	}
	return 0;
}


单链表的增删查改

 c1.h

 #ifndef _C1_H_
 #define _C1_H_
  
 #include<string.h>
 #include<stdio.h> /* EOF(=^Z或F6),NULL */
 #include<stdlib.h> /* malloc()等 */
 #include<math.h> /* floor(),ceil(),abs() */
 
 /* 函数结果状态代码 */
 #define TRUE 1
 #define FALSE 0
 #define OK 1
 #define ERROR 0
 #define INFEASIBLE -1
 /* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */
 typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
 typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
 
 #endif

stuscore.c

#include"c1.h"
typedef struct student
{
	char num[6];
	char name[20];
	int score1,score2,score3;
	struct student *next;
}LNode,*LinkList;
void menu();
void CreateList_L(LinkList *L,int n);
void Print_L(LinkList L);
int ListInsert_L(LinkList *L,int i,LNode e);
int ListDelete_L(LinkList *L,int i);
void Print_L(LinkList L);
void help();
//查询学生信息函数
//修改学生信息
//保存学生信息

void help()//辅助系统 
{
	printf("\n0.欢迎使用系统帮助!\n");
	printf("\n1.初次进入系统后,请先选择学生成绩单链表的创建;\n");
	printf("\n2.按照菜单提示键入数字代号;\n");
	printf("\n3.增加学生信息后,请输出学生信息,查验;\n");
	printf("\n4.谢谢您的使用!\n");
	printf("\n");
}

void menu()
{
	printf("****学生成绩管理系统****\n");
	printf("1.学生成绩单链表的创建\n");
	printf("2.插入学生信息\n");
	printf("3.删除学生信息\n");
	printf("4.输出学生信息\n");
	printf("0.退出");
}
void CreateList_L(LinkList *L,int n)
{
	LinkList r,p;
	int i;
	(*L)=(LinkList)malloc(sizeof(LNode));
	r=(*L);
	for(i=1;i<=n;i++)
	{
		p=(LinkList)malloc(sizeof(LNode));
		printf("请输入第%d位学生的学号 姓名 成绩(用空格分隔我):",i);
		scanf("%s %s %d %d %d",p->num,p->name,&p->score1,&p->score2,&p->score3);
		p->next=NULL;
		r->next=p;
		r=p;
    } 
}
void Print_L(LinkList L)
{
	LinkList p;
	int i;
	p=L->next;
	if(!p)
	printf("该学生成绩表为空表!\n");
	else
	{
		printf("所有学生信息:\n");
		printf("学号\t姓名\t数据结构成绩\t高等数学成绩\t大学英语成绩\n");
		while(p)
		{
			printf("%s\t%s\t      %d\t      %d\t      %d\n",p->num,p->name,p->score1,p->score2,p->score3);
			p=p->next;
		}
	}
}
int ListInsert_L(LinkList *L,int i,LNode e)
{
	LinkList p,s;
	int j;
	p=(*L);
	j=0;
	while(p&&j<i-1)
	{
		p=p->next;
		j++;
	}
	if(!p||j>i-1)
	    return ERROR;
	s=(LinkList)malloc(sizeof(LNode));
	*s=e;
	s->next=p->next;
	p->next=s;
	return OK;
	
}
int ListDelete_L(LinkList *L,int i)
{
	LinkList p,q;
	int j;
	p=(*L);
	j=0;
	while(p->next&&j<i-1)
	{
		p=p->next;
		j++;
	}
	if(!(p->next)||j>i-1)
	return ERROR;
	q=p->next;
	p->next=q->next;
	free(q);
	return OK;
}

int main()
{
	
	LinkList L;
	int choose,n,i,temp;
	LNode e;
	char snum[20];
	help();
	while(1)
	{
		menu();
		printf("\n请选择功能:");
		scanf("%d",&choose);
		switch(choose)
		{
			case 1:
				printf("学生成绩单链表的创建\n");
					printf("\n请选择功能:");
				
				scanf("%d",&n);
				CreateList_L(&L,n);
				Print_L(L);
				break;
			case 2:
				printf("请插入学生信息\n");
				scanf("%d",&i);
				printf("请输入要插入学生的学号 姓名 数据结构成绩\t高等数学成绩\t大学英语成绩(用空格分隔):");
				scanf("%s %s %d %d %d",e.num,e.name,e.score1,e.score2,e.score3);
				temp=ListInsert_L(&L,i,e);
				if(temp==OK)
				{
					printf("插入成功!\n");
						printf("\n请选择功能:");
					Print_L(L);
				}
				else
				printf("插入失败!\n");
				break;
			case 3:
				printf("删除学生信息\n");
				printf("请输入要删除元素的位置");
				scanf("%d",&i);
				temp=ListDelete_L(&L,i);
				if(temp==OK)
				{
					printf("删除成功!\n");
						printf("\n请选择功能:");
					Print_L(L);
				 } 
				 else
				 printf("删除失败!\n");
				break;
			case 4:
				printf("输出学生信息\n");
					printf("\n请选择功能:");
                Print_L(L);
				break;
			case 0:
			    printf("退出系统!\n");	
				return 0;
			default:
				printf("输入错误,请重新输入!\n");
				break;
		}
	}
	return 0;
 } 

 


宝子,你不点个赞吗?不评个论吗?不收个藏吗?

最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!

喵喵喵,你对我真的很重要。

第1章 绪论 1.1 数据结构的基本概念和术语 1.1.1 引言 1.1.2 数据结构有关概念及术语 1.1.3 数据结构和抽象数据类型(ADT) 1.2 算法描述与分析 1.2.1 什么是算法 1.2.2 算法描述工具——C语言 1.2.3 算法分析技术初步 习题一 第2章 线性表 2.1 线性表的定义及其运算 2.1.1 线性表的定义 2.1.2 各种运算简介 2.2 线性表的顺序存储结构(向量) 2.2.1 顺序存储结构(向量) 2.2.2 向量中基本运算的实现 2.3 线性表的链表存储结构 2.3.1 单链表与指针 2.3.2 单链表的基本运算 2.4 循环链表和双向链表 2.4.1 循环链表 2.4.2 双向链表 2.4.3 顺序存储结构与链表存储结构的综合分析与比较 2.5 多项式相加问题 2.5.1 多项式相加的链表存储结构 2.5.2 多项式相加的算法实现 2.6 线性表的算法实现举例 2.6.1 实现线性表顺序存储结构及运算的C语言源程序 2.6.2 单链表处理的C语言源程序 习题二 第3章 栈和队列 3.1 栈 3.1.1 栈的定义及其运算 3.1.2 栈的顺序存储结构(向量) 3.1.3 栈的链表存储结构 3.1.4 栈的应用 3.2 队列 3.2.1 队列的定义及运算 3.2.2 队列的顺序存储结构(向量) 3.2.3 队列的链表存储结构 3.3 栈和队列的算法实现举例 习题三 第4章 串 4.1 串的基本概念 4.2 串的存储结构 4.2.1 串的顺序存储 4.2.2 串的链表存储 4.2.3 串变量的存储映象 4.3 串的运算 4.3.1 串的运算简介 4.3.2 串的匹配运算 4.4 文本编辑 习题四 第5章 数组和广义表 5.1 数组的基本概念 5.1.1 数组的概念 5.1.2 数组的顺序表示 5.1.3 特殊矩阵的压缩存储 5.2 稀疏矩阵的三元组存储 5.2.1 三元组表 5.2.2 稀疏矩阵的运算 5.3 稀疏矩阵的十字链表存储 5.3.1 十字链表的组成 5.3.2 十字链表的有关算法 5.4 广义表 5.4.1 广义表的概念和特性 5.4.2 广义表的存储结构 5.4.3 求广义表的深度 5.4.4 广义表的输出 5.4.5 建立广义表的存储结构 5.5 迷宫问题 习题五 第6章 树 6.1 树的基本概念和术语 6.1.1 树的定义 6.1.2 树的常用术语 6.1.3 树的表示方法 6.2 二叉树 6.2.1 二叉树的定义 6.2.2 二叉树的重要性质 6.2.3 二叉树的存储结构 6.2.4 二叉树二叉链表的一个生成算法 6.3 遍历二叉树 6.3.1 先根遍历 6.3.2 中根遍历 6.3.3 后根遍历 6.3.4 二叉树遍历算法的应用 6.4 线索二叉树 6.4.1 线索二叉树的基本概念 6.4.2 线索二叉树的逻辑表示图 6.4.3 中根次序线索化算法 6.4.4 在中根线索树上检索某结点的前趋或后继 6.4.5 在中根线索树上遍历二叉树 6.5 二叉树、 树和森林 6.5.1 树的存储结构 6.5.2 树与二叉树之间的转换 6.5.3 森林与二叉树的转换 6.5.4 一般树或森林的遍历 6.6 树的应用 6.6.1 二叉排序树 6.6.2 哈夫曼树及其应用 6.7 二叉树的建立和遍历C语言源程序示例 习题六 第7章 图 7.1 图的基本概念和术语 7.1.1 图的基本概念 7.1.2 路径和回路 7.1.3 连通图 7.1.4 顶点的度 7.2 图的存储结构 7.2.1 邻接矩阵 7.2.2 邻接链表 7.3 图的遍历和求图的连通分量 7.3.1 图的建立 7.3.2 图的遍历 7.3.3 求图的连通分量 7.4 图的生成树 7.4.1 生成树的概念 7.4.2 最小生成树 7.4.3 普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法 7.5 最短路径 7.5.1 单源顶点最短路径问题求解 7.5.2 求有向网中每对顶点间的路径 7.6 有向无环图及应用 7.6.1 拓扑排序 7.6.2 关键路径 7.7 图的算法C语言程序实现举例 7.7.1 无向图的邻接表的建立和遍历 7.7.2 有向无环图的拓扑排序和求关键路径 习题七 第8章 查找 8.1 基本概念
评论 169
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫佛佛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值