# include<stdio.h>
# include<stdlib.h> //包含了exit函数
# include<malloc.h> //包含了 malloc函数,主要是申请动态内存
//定义一个结构体,包含三个成员变量
struct Arr{
int *pBase;//存储数组第一个元素的地址
int len;//数组的长度
int cnt;//当前数组的有效元素个数,相当于数组的下标
};
void init_arr(struct Arr *pArr,int length);//数组的初始化方法
bool append_arr(struct Arr *pArr,int val);//向数组中增加元素
bool insert_arr(struct Arr *pArr,int pos,int val);//向数组中插入元素
bool delete_arr(struct Arr *pArr,int pos,int *pVal);//向数组中删除
int get();//得到数据
bool is_empty(struct Arr *pArr);
bool is_full(struct Arr *pArr);
void sort_arr(struct Arr *pArr);
void show_arr(struct Arr *pArr);
void inversion_arr(struct Arr *pArr);
int main(void){
//删除的值
int val;
struct Arr arr;
//初始化数组
init_arr(&arr,6);
show_arr(&arr);
//向数组中追加元素
append_arr(&arr,1);
append_arr(&arr,2);
append_arr(&arr,3);
append_arr(&arr,4);
append_arr(&arr,5);
//插入数据
insert_arr(&arr,2,99);
show_arr(&arr);
delete_arr(&arr,6,&val);
printf("删除的值是%d\n",val);
show_arr(&arr);
sort_arr(&arr);
printf("排序后\n");
show_arr(&arr);
inversion_arr(&arr);
return 0;
}
void init_arr(struct Arr *pArr,int length){
//申请内存
pArr->pBase = (int *)malloc(sizeof(int)*length);
if(NULL == pArr->pBase){
printf("初始化失败,内存不足\n");
exit(-1);
}else{
pArr->len = length;
pArr->cnt = 0;
}
return;
}
bool is_empty(struct Arr *pArr){
//主要通过里面的元素来判断
if(pArr->cnt == 0){
return true;
}else{
return false;
}
}
void show_arr(struct Arr *pArr){
// printf("len = %d cnt = %d",pArr->len,pArr->cnt);
if(is_empty(pArr)){
printf("当前的数组为空\n");
}else{
for(int i = 0;i < pArr->cnt;i++){
printf("%d\n",pArr->pBase[i]);
}
}
return;
}
bool is_full(struct Arr *pArr){
if(pArr->cnt == pArr->len){
return true;
}else{
return false;
}
}
bool append_arr(struct Arr *pArr,int val){
//如果数组已经满了,则返回false
if(is_full(pArr)){
return false;
}else{
//如果不满就填充数据
pArr->pBase[pArr->cnt] = val;
pArr->cnt++;
return true;
}
}
bool insert_arr(struct Arr *pArr,int pos,int val){
if(is_full(pArr)){
return false;
}
//如果输入的下标小于当前有效个数两个的话返回false
// 当插入到当前有效数字的后面时,相当于追加
if(pos < 1 || pos > pArr->cnt + 1){
return false;
}
/**
i 等于有效个数,当插入的位置小于有效个数时,将数据往后互换
如果当插入位置在有效位置之后,就不执行for循环
*/
for(int i = pArr->cnt; i >= pos;i--){
pArr->pBase[i] = pArr->pBase[i-1];
}
pArr->pBase[pos - 1] = val;
pArr->cnt++;
return true;
}
bool delete_arr(struct Arr *pArr,int pos,int* pVal){
if(is_empty(pArr)){
return false;
}
if(pos < 1 || pos > pArr->cnt){
return false;
}
//先将要删除的值赋值给val ,在cnt之前删除,就需要将删除的位置赋值为后一位,
//后一位的值为再后一位的值
*pVal = pArr->pBase[pos-1];
for(int i = pos; i < pArr->cnt;i++){
pArr->pBase[i - 1] = pArr->pBase[i];
}
pArr->cnt--;
return true;;
}
void inversion_arr(struct Arr *pArr){
int i = 0;
int j = pArr->cnt-1;
int t;
while(i < j){
t = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = t;
i++;
j++;
}
return;
}
//排序
void sort_arr(struct Arr *pArr){
int i,j;
int t;
for(i = 0;i<pArr->cnt - 1;i++){
for(j = i+1;j <pArr->cnt;j++){
if(pArr->pBase[i] < pArr->pBase[j]){
t = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = t;
}
}
}
return;
}
链表实现 list
# include<stdio.h>
# include<malloc.h>
# include<stdlib.h>
typedef struct Node{
int data;//数据域 存放数据
struct Node * pNext;//指针域 存放地址
}NODE,*PNODE;
PNODE createList(void);
void traversion(PNODE);
bool is_empty(PNODE);
int length_list(PNODE);
void sort_list(PNODE);
bool insert_list(PNODE,int,int);
bool delete_list(PNODE,int,int *);
int main(void){
int val;
PNODE pNode = NULL;
pNode = createList();
traversion(pNode);
int length;
length = length_list(pNode);
printf("数组的长度为%d \n",length);
sort_list(pNode);
printf("排序后\n");
traversion(pNode);
insert_list(pNode,1,34);
printf("插入后输出数据\n");
traversion(pNode);
delete_list(pNode,3,&val);
printf("删除后输出数据\n");
printf("删除的值为%d\n",val);
traversion(pNode);
return 0;
}
PNODE createList(void){
int len;//存放有效数据的个数
int i;
int val;// 存放用户临时输入的数据
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if(pHead == NULL){
printf("分配头结点失败\n");
exit(-1);
}
PNODE pTail; // 作用相当于游标
pTail = pHead;
pTail->pNext = NULL;
printf("请输入要存放数据的个数 len =");
scanf("%d",&len);
for(i=0;i<len;i++){
printf("请输入第%d个的值:",i+1);
scanf("%d",&val);
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(pNew == NULL){
printf("分配失败\n");
exit(-1);
}
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
}
void traversion(PNODE pHead){
PNODE p = pHead->pNext;
while(p != NULL){
printf("%d ",p->data);
p = p->pNext;
}
printf("\n");
}
bool is_empty(PNODE pHead){
if(pHead->pNext == NULL)
return true;
else
return false;
}
int length_list(PNODE pHead){
PNODE p;
p = pHead->pNext;
int cnt = 0;
while(NULL != p){
cnt++;
p = p->pNext;
}
return cnt;
}
void sort_list(PNODE pHead){
int i,j,t;
int len = length_list(pHead);
PNODE p,q;
for(i=0,p = pHead->pNext;i<len-1;i++,p=p->pNext)
for(j=i+1,q=p->pNext;j<len;j++,q = q->pNext){
if(p->data > q->data){
t = p->data;
p->data = q->data;
q->data = t;
}
}
return;
}
bool insert_list(PNODE pHead,int pos,int val){
int i= 0;
PNODE p = pHead;
/**
while 和if 是重点
理解:
当pos = -1时
while 0 < -1-1 = false 不执行
if 0 > -2 = true, return false
当pos = 0 时
while 0 < -1 = false,不执行
if 0 > -1 = true,return false;
当pos = 1时
while 0 < 1-1 = false,不执行
if 0 > 0 不成立,继续向下执行,
p-pNext本来指向首节点
当pos = 3 时
第一次:0 < 3 -1 = true
p = 首节点,i = 1,
第二次: 1 < 3-1 = true
p = 第二个节点 , i = 2,
第三次: 2 < 3-1 = false
if 2 > 2 不执行
p-pNext 本来指向第三个节点
*/
while(NULL != p && i < pos -1){
p = p->pNext;
i++;
}
if(i > pos -1 || NULL == p)
return false;
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->data = val;
//三行代码实现插入
//PNODE q = p->pNext;
// p->pNext = pNew;
// pNew->pNext = q;
//两行代码实现插入
pNew->pNext = p->pNext;
p->pNext = pNew;
return true;
}
bool delete_list(PNODE pHead,int pos,int * pVal){
int i = 0;
PNODE p = pHead;
while(NULL != p->pNext && i < pos-1){
p = p->pNext;
i++;
}
if(i > pos-1 || p->pNext == NULL)
return false;
PNODE q = p->pNext;
*pVal = q->data;
p->pNext = p->pNext->pNext;
free(q);
q = NULL;
return true;
}
网友评论