1. 顺序表
1.1 写法1
Linear_Opeartor2.c
#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"
#include "string.h"
//顺序表//申明顺序表的大小
#define MAXSIZE 5
typedef bool status;
//创建顺序表
int *Linear_Create()
{int *p=(int *)malloc(sizeof(int)*MAXSIZE);if(p==NULL){printf("创建顺序表失败!\n");return NULL;}//将顺序表进行清空memset(p,0,sizeof(int)*MAXSIZE);return p;
}
//判断顺序表是否已满
int Linear_Is_Full(int *p)
{//如果顺序表已满,返回-1,如果顺序表未满,返回空的位置下标for(int i=0;i<MAXSIZE;i++){if(p[i]==0){return i;}}return -1;
}
//判断顺序表是否为空
status Linear_Is_Empty(int *p)
{if(p[0]==0){printf("顺序表为空!\n");return true;}return false;
}//向顺序表中插入数据,按照顺序插入
status Linear_Insert(int *p,int data)
{//判断顺序表是否已满if(Linear_Is_Full(p)<0){printf("顺序表已满,插入失败!\n");return false;}int pos=Linear_Is_Full(p);p[pos]=data;return true;
}
//遍历顺序表
status Linear_Travel(int *p)
{if(p==NULL){printf("顺序表不存在,遍历失败!\n");return false;}for(int i=0;i<MAXSIZE;i++){printf("p[%d]=%d\n",i,*(p+i));}return true;
}
//删除顺序表中的数据
status Linear_Delete(int *arr,int *data)
{if(Linear_Is_Empty(arr)){printf("顺序表为空,删除失败!\n");return false;}if(Linear_Is_Full(arr)<0){arr[MAXSIZE-1]=0;return true;}int pos=Linear_Is_Full(arr);*data=arr[pos-1];arr[pos-1]=0;return true;
}
//在顺序表的指定位置插入数据
status Linear_Insert_Fixed_Data(int *p,int pos,int data)
{//判断顺序表是否已满if(Linear_Is_Full(p)<0){printf("顺序表已满,插入失败!\n");return false;}//判断位置是否越界if(pos<0||pos>MAXSIZE-1){printf("插入位置越界,插入失败!\n");return false;}int pos1=Linear_Is_Full(p);if(pos1==pos){p[pos]=data;return true;}if(pos1<pos){printf("插入的位置前还有空位置,插入失败!\n");return false;}if(pos1>pos){for(int i=MAXSIZE-1;i>pos;i--){p[i]=p[i-1];}p[pos]=data;return true;}}
//删除顺序表的指定位置的数据
status Linear_Delete_Fixed_Data(int *p,int pos,int *data)
{if(Linear_Is_Empty(p)){printf("顺序表为空,删除失败!\n");return false;}if(pos<0||pos>MAXSIZE-1){printf("传入的位置,超出了顺序表的大小,删除失败!\n");return false;}if(p[pos]==0){printf("传入的位置对应的数据元素为空,删除失败!\n");return false;}else{*data=p[pos];for(int i=pos;i<MAXSIZE-1;i++){p[i]=p[i+1];}p[MAXSIZE-1]=0;return true;}}
int main()
{int *arr=Linear_Create();//向顺序表中插入数据Linear_Insert(arr,10);Linear_Insert(arr,20);Linear_Insert(arr,30);Linear_Insert(arr,40);//遍历顺序表Linear_Travel(arr);printf("####################\n");Linear_Insert_Fixed_Data(arr,1,50);Linear_Travel(arr);printf("####################\n");// Linear_Insert_Fixed_Data(arr,3,60);Linear_Travel(arr);return 0;
}
1.2 写法2
Linear_Opeartor.c
#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"
#include "string.h"
//顺序表//申明顺序表的大小
#define MAXSIZE 5
typedef bool status;
//创建顺序表
int *Linear_Create()
{int *p=(int *)malloc(sizeof(int)*MAXSIZE);if(p==NULL){printf("创建顺序表失败!\n");return NULL;}//将顺序表进行清空memset(p,0,sizeof(int)*MAXSIZE);return p;
}
//判断顺序表是否已满
int Linear_Is_Full(int *p)
{//如果顺序表已满,返回-1,如果顺序表未满,返回空的位置下标for(int i=0;i<MAXSIZE;i++){if(p[i]==0){return i;}}return -1;
}
//判断顺序表是否为空
status Linear_Is_Empty(int *p)
{if(p[0]==0){printf("顺序表为空!\n");return true;}return false;
}//向顺序表中插入数据,按照顺序插入
status Linear_Insert(int *p,int data)
{//判断顺序表是否已满if(Linear_Is_Full(p)<0){printf("顺序表已满,插入失败!\n");return false;}int pos=Linear_Is_Full(p);p[pos]=data;return true;
}
//遍历顺序表
status Linear_Travel(int *p)
{if(p==NULL){printf("顺序表不存在,遍历失败!\n");return false;}for(int i=0;i<MAXSIZE;i++){printf("p[%d]=%d\n",i,*(p+i));}return true;
}
//删除顺序表中的数据
status Linear_Delete(int *arr,int *data)
{if(Linear_Is_Empty(arr)){printf("顺序表为空,删除失败!\n");return false;}if(Linear_Is_Full(arr)<0){arr[MAXSIZE-1]=0;return true;}int pos=Linear_Is_Full(arr);*data=arr[pos-1];arr[pos-1]=0;return true;
}//在任意位置插入数据
//1 2 3 4 5
status Linear_Insert_renyi(int *arr,int pos,int date){if(Linear_Is_Full(arr)<0){printf("顺序表已经满了,插入数据失败\n");return false;}int end = MAXSIZE-1;while(end>pos){arr[end] = arr[end-1];end--;}arr[pos] = date;}//在任意位置删除
//1 2 3 4 5
status Linear_delete_renyi(int *arr,int pos){if(Linear_Is_Empty(arr)){printf("顺序表为空,不能删除数据\n");return false;}int begin = pos;while(begin<MAXSIZE-1){arr[begin] = arr[begin+1];begin++;}arr[MAXSIZE-1] = 0;}int main()
{int *arr=Linear_Create();//向顺序表中插入数据Linear_Insert(arr,10);Linear_Insert(arr,20);Linear_Insert(arr,30);//遍历顺序表Linear_Travel(arr);printf("####################\n");int data;Linear_Delete(arr,&data);printf("删除的数据为:%d\n",data);Linear_Travel(arr);printf("####################\n");Linear_Insert(arr,30);Linear_Insert_renyi(arr,0,50);Linear_Insert_renyi(arr,4,70);Linear_Travel(arr);printf("####################\n");Linear_delete_renyi(arr,3);Linear_Travel(arr);return 0;
}
2. 合并两个有序的顺序表
hebingbiao.c
/*************************************************************************> File Name: hebingbiao.c> Author: lsf> Mail: lsf_2012@163.com > Created Time: 2023年10月12日 星期四 16时26分00秒************************************************************************/#include<stdio.h>//合并两个有序的顺序表void hebingshunxvbiao(int *arr3,int *arr1,int *arr2,int sz1,int sz2){int str3 = 0;int str1 = 0;int str2 = 0;while(str1<sz1 && str2<sz2){if(arr1[str1]<arr2[str2]){arr3[str3] = arr1[str1];str1++;}else{arr3[str3] = arr2[str2];str2++;}str3++;}while(str1<sz1){arr3[str3++] = arr1[str1++];}while(str2<sz2){arr3[str3++] = arr2[str2++];}}int main()
{int arr1[] = {1,5,7,9,11};int arr2[] = {1,2,4};int arr3[40];int sz1 = sizeof(arr1)/sizeof(arr1[0]);int sz2 = sizeof(arr2)/sizeof(arr2[0]);hebingshunxvbiao(arr3,arr1,arr2,sz1,sz2);int sz3 = sz1+sz2;for(int i=0;i<sz3;i++){printf("%d ",arr3[i]);}}
3. 使用链表完成一个简单的学生管理系统
student.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//链表
struct Node{char name[20];int age;struct Node* next;
};struct Node* L = NULL;//定义一个全局变量的头指针//新增学生
void stu_insert(){struct Node* newstu = (struct Node*)malloc(sizeof(struct Node));//录入信息printf("请输入名字:");scanf("%s",newstu->name);printf("请输入年龄:");scanf("%d",&(newstu->age));newstu->next = NULL;if(L==NULL){//如果头结点指向空,就证明该链表还买有数据L = newstu;//头指针指向新的学生数据}else{//反之链表中已经有了数据//遍历链表找到最后一个数据,将新数据追加上去struct Node* p = L;while (p->next!=NULL){p = p->next;}//到这里已经找到了最后一个数据,将新数据追加在后面p->next = newstu;}}//遍历链表
void bianli(){struct Node* p = L;//将头指针赋值给一个新的变量,防止头结点丢失if(p==NULL){printf("没有学生信息\n");return;}while(p!=NULL){printf("姓名:%s 年龄:%d\n",p->name,p->age);p = p->next;//指向下一个节点}
}//查询学生信息
struct Node * select(){char name[20];printf("请输入学生的姓名:");scanf("%s",name);struct Node* p = L;//将头指针赋值给一个新的变量,防止头结点丢失while(p!=NULL){if(strcmp(name,p->name)==0){printf("该生信息如下\n");printf("姓名:%s 年龄:%d\n",p->name,p->age);return p;}p = p->next;//指向下一个节点}printf("没有该学生\n");return NULL;
}//更改学生信息
void update(){struct Node* p = select();//先查学生if(p!=NULL){//学生存在printf("请重新录入该生信息\n");//录入信息printf("请输入名字:");scanf("%s",p->name);printf("请输入年龄:");scanf("%d",&(p->age));printf("学生信息更改成功\n");}else{printf("你要更改的学生不存在\n");}}//删除学生信息
void delete(){char name[20];printf("请输入要删除的学生得姓名:");scanf("%s",name);//双指针struct Node *pre = NULL;struct Node *cur = L;while(cur!=NULL){//遍历链表if(strcmp(name,cur->name)==0){//找到了删的人if(pre==NULL){//头结点是要删的人L = cur->next;}else{pre->next = cur->next;}printf("该生已被删除\n");free(cur);cur=NULL;return;}pre = cur;cur = cur->next;}printf("该生不存在\n");}void menu(){printf("****************************\n");printf("***1.add 2.select*****\n");printf("***3.show 4.upadte*****\n");printf("***5.delete 0.exit *****\n");printf("****************************\n");
}int main()
{int input;do{menu();printf("请选择:");scanf("%d",&input);switch (input){case 1:stu_insert();//新增break;case 2:select();//查询break;case 3:bianli();//遍历break;case 4:update();//更改break;case 5:delete();//删除break;case 0:bianli();//遍历break;default:printf("选择错误\n");break;}}while(input);return 0;
}