顺序表的增删查
#include<stdio.h>
#define MAXSIZE 100
typedef struct shunxubiao{
int data[MAXSIZE];
int length;
}sxb;
void createlist(sxb *L);
int insertSqList(sxb *L);
int delSqList(sxb *L);
void print(sxb L);
int main()
{
//1.创建顺序表
sxb L;
createlist(&L);
print(L);
//2.增:插入一个数字
insertSqList(&L);
print(L);
//3.删:删除某个位置的数字
delSqList(&L);
print(L);
//4.查:查找顺序表中是否有某元素
int n;
n=find(L);
if(n) printf("YES");
else printf("NO");
return 0;
}
//创建
void createlist(sxb *L)
{
int i;
scanf("%d",&L->length);
for(i=0;i<L->length;i++)
{
scanf("%d",&L->data[i]);
}
}
//增:插入一个数字
int insertSqList(sxb *L)
{
//1.判断是否可以插入
if(L->length==MAXSIZE) return 0;
//2.从an开始移动元素
else {
int num,x;
scanf("%d%d",&num,&x);
int i;
for(i=L->length-1;i>=x;i--)
{
L->data[i+1]=L->data[i];
}
L->data[x]=num;
L->length++;
return 1;
}
}
//删:删除某个位置的数字
int delSqList(sxb *L)
{
//1.判断是否可以删除元素
if(L->length==0) return 0;
//2.从x处开始覆盖
else
{
int x;
scanf("%d",&x);
int i;
for(i=x;i<L->length;i++)
{
L->data[i]=L->data[i+1];
}
L->length--;
return 1;
}
}
//查:查找顺序表中是否有某元素
int find(sxb L)
{
int i,num,flag=0;
scanf("%d",&num);
for(i=0;i<(*L).length;i++)
{
if(L.data[i]==num)
flag=1;
}
return flag;
}
//控制台输出函数
void print(sxb L)
{
int i;
for(i=0;i<L.length;i++)
{
printf("%3d",L.data[i]);
}
printf("\n");
}
单链表的表头表尾创建及增删查
#include<stdio.h>
#include<malloc.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode;
typedef LNode *LinkList;
LinkList Create_biaotou(LinkList L);
LinkList Create_biaowei(LinkList L);
int insert(LinkList L);
int del(LinkList L);
int find(LinkList L);
void print(LinkList L);
int main()
{
//1.1表头法创建单链表
LinkList L;
L=Create_biaotou(L);
print(L);
/**
1.2表尾法创建单链表
Create_biaowei(L);
**/
//2.增:插入一个结点
insert(L);
print(L);
//3.删:删除某位置的结点
del(L);
print(L);
//4.查:查找单链表中是否有某元素
int n;
n=find(L);
if(n==1) printf("YES");
else printf("NO");
return 0;
}
//表头创建单链表
LinkList Create_biaotou(LinkList L)
{
LinkList p;
int num,i;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
//num 单链表数据个数
scanf("%d",&num);
for(i=0;i<num;i++)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
return L;
}
//表尾法创建单链表
LinkList Create_biaowei(LinkList L)
{
LinkList p,q;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
q=L;
int num,i;
scanf("%d",&num);
for(i=0;i<num;i++)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
q->next=p;
q=p;
}
q->next=NULL;
return L;
}
//增:插入一个结点
int insert(LinkList L)
{
//1.创建要插入的结点s,输入其中数值
LinkList s,p;
s=(LinkList)malloc(sizeof(LNode));
scanf("%d",&s->data);
p=L->next;
//2.输入需要插入的位置
int x;
scanf("%d",&x);
//3.查找x-1的位置
int i=1,flag=0;
while(p->next!=NULL)
{
if(i==x-1)
{
flag++;
break;
}
p=p->next;
i++;
}
//4.找到位置后插入,本次使用表头插入法
if(flag==1)
{
s->next=p->next;
p->next=s;
}
return flag;
}
//删:删除某位置的结点
int del(LinkList L)
{
//1.输入要删除的位置
int x;
scanf("%d",&x);
//2.查找x-1的位置
LinkList p;
p=L->next;
int i=1,flag=0;
while(p->next!=NULL)
{
if(i==x-1)
{
flag++;
break;
}
p=p->next;
i++;
}
//3.已找到x-1位置,进行删除操作
if(flag==1)
{
p->next=p->next->next;
}
return flag;
}
//查:查找单链表中是否有某元素
int find(LinkList L)
{
LinkList p;
p=L->next;
int num,flag=0;
scanf("%d",&num);
while(p!=NULL)
{
if(p->data==num)
{
flag++;
break;
}
p=p->next;
}
return flag;
}
//控制台输出函数
void print(LinkList L)
{
LinkList p;
p=L->next;
while(p!=NULL)
{
printf("%3d",p->data);
p=p->next;
}
printf("\n");
}
查找
顺序查找
int n = sizeof(a)/sizeof(a[0]);
注释:上面这行代码,是将数组a的大小除于他的第一项大小,得到的是数组有几项。可以省略手动更改数组大小的步骤,提高了代码的可扩充性与稳定性。
#include<stdio.h>
int main()
{
int a[10]={2,8,10,18,19,30,36,50,81,90};
int i;
int num;
scanf("%d",&num);
for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
{
if(num==a[i])
{
printf("YES");
break;
}
}
if(i==sizeof(a)/sizeof(a[0])) printf("NO");
return 0;
}
二分查找
#include<stdio.h>
int main()
{
int a[10]={2,8,10,18,19,30,36,50,81,90};
int low,high,mid;
low=0;
high=(sizeof(a)/sizeof(a[0]))-1;
int b=18;//需要查找的数字
while(low<=high){
mid=(low+high)/2;
if(b==a[mid]) break;
else if(b<a[mid]) high=mid-1;
else if(b>a[mid]) low=mid+1;
}
printf("%d",mid);
return 0;
}
排序
冒泡排序
#include<stdio.h>
void swap(int *a,int *b);
void print(int a[],int n);
int main()
{
int a[10]={38,25,45,15,2,6,48,66,81,25};
int n=sizeof(a)/sizeof(a[0]); //元素个数
int i,j;
for(i=n-1;i>=0;i--)
{
for(j=0;j<i;j++)
{
if(a[j]>a[j+1])
swap(&a[j],&a[j+1]);
}
}
print(a,n);
return 0;
}
//交换函数
void swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
//控制台输出函数
void print(int a[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%5d",a[i]);
}
}
选择排序
#include<stdio.h>
void swap(int *a,int *b);
void print(int a[],int n);
int main()
{
int a[10]={38,25,45,15,2,6,48,66,81,25};
int n=sizeof(a)/sizeof(a[0]); //元素个数
int i,j;
int minIndex; //最小元素下标
for(i=0;i<n;i++)
{
minIndex=i;
for(j=i+1;j<n;j++)
{
if(a[j]<a[minIndex])
{
minIndex=j;
}
}
swap(&a[i],&a[minIndex]);
}
print(a,n);
return 0;
}
//交换函数
void swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
//控制台输出函数
void print(int a[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%5d",a[i]);
}
}
插入排序
#include<stdio.h>
/**
* 思路:用扑克牌思想模拟:for循环从1开始表示手中已经握有一张a[0],index记录手中握着的第一张牌
* 当手里还有牌比较且他的下一张还是比要插入的牌大,就将比它大的那张牌往后移一位,再比较下一张牌
* while循环结束有两种情况:1.手里没牌比较了 2.牌找到了合适的位置插入,也就是下一张比他小
* 那么就插入在比他小的上一位置。
*/
void print(int a[],int n);
int main()
{
int a[10]={38,25,45,15,2,6,48,66,81,25};
int n=sizeof(a)/sizeof(a[0]); //元素个数
int index,x; //index 表示位置
int i;
for(i=1;i<n;i++)
{
index=i-1;
x=a[i];
while(index>=0 && a[index] > x)
{
a[index+1]=a[index];
index--; //跟下一张比较
}
a[index+1] = x;
}
print(a,n);
return 0;
}
//控制台输出函数
void print(int a[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%5d",a[i]);
}
}
以上代码若有不妥或者可以修改地更好的地方,欢迎评论区交流讨论~