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;
}