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