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

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

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

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

目录

单链表增删查改

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("顺序表空间的起始化为:%xn",L.elem);
					printf("顺序表的当前长度为:%dn",L.length);
					printf("顺序表的当前最大容量为:%dn",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("%st%st      %dt      %dt      %dn",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;
 } 

 


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

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

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