当时是照着传智还是什么的写的,时间长了也记不清楚了。既然重新温习C语言。干脆把这段代码放上来,有时候也可以看看。
菜鸟学数据结构之(1)创建简单的结构体及使用
#include <stdio.h>
/*定义简单的结构体*/
struct Student{
int sid;
char name[2000];
int age;
};
/*结构体显示的几种种方式*/
void xians(struct Student sta ){
printf("sid=%d name =%s age=%d\n",sta.sid,sta.name,sta.age);
}
void xians2(struct Student sta ){
struct Student *p = &sta ; /*先定义一个结构体指针*/
printf("sid=%d name =%s age=%d\n",p->sid,p->name,p->age); /*这里的p->sid 就等于(*p).sid */
}
/*上面的都不推荐,因为耗费内存*/
void xians3(struct Student *p){ /*这样传指针只需要传4个字节,好*/
printf("sid=%d name =%s age=%d\n",p->sid,p->name,p->age); /*这里的p->sid 就等于(*p).sid */
}
int main(void){
struct Student st = {1,"wode",20};
xians(st);
xians2(st);
xians3(&st);
}菜鸟学数据结构之(2)动态分配内存
#include <stdio.h>
#include <malloc.h>
int main(void)
{ int a[5] ={4,10,2,8,6};
int len;
printf("请输入你要使用数组的长度len=");
scanf("%d",&len);
int *parr = (int *)malloc(sizeof(int)*len); /*动态分配内存*/
*parr =4;
parr[1] = 5; /*可以这样直接赋值*/
for(int i=0;i<len;i++){
scanf("%d",&parr[i]);
}
for(int i=0;i<len;i++){
printf("%d\n",*(parr+i));
}
free(parr); /*释放指针*/
return 0;
}菜鸟学数据结构之(3)跨函数使用内存
/*跨函数使用内存例子*/
#include <stdio.h>
#include <malloc.h>
/*定义一个结构体*/
struct Student {
int sid;
int age;
};
struct Student * CreateStudent(void); //创建结构体函数 ,返回值为结构体指针
void showStudent(struct Student *); //定义显示结构体函数 ,无返回值,参数为结构体指针
int main(void)
{
struct Student * st;
st = CreateStudent();
st->sid = 50;
st->age = 80;
showStudent(st);
free(st); //释放 指针
return 0;
}
struct Student * CreateStudent(void){
struct Student * p = (struct Student * )malloc(sizeof(struct Student));
return p;
}
void showStudent(struct Student *p){
printf("sid=%d,age=%d\n",p->sid,p->age);
}菜鸟学数据结构之(4) 模拟数组操作
/*模拟数组的一些常用操作*/
#include <stdio.h>
#include <malloc.h> /*内存操作*/
#include <stdlib.h> /*包含了exit函数*/
/*定义一个数据类型,名称叫struct Arr*/
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 *val); /*删除,参数为指针,删除位置,返回删除元素的指针*/
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 *); /*显示输出*/
void inversion_arr(struct Arr *); /*倒置*/
void quicksort_arr(struct Arr *,int,int); /*快速排序*/
int main(void)
{
struct Arr arr; /*创建一个数组变量*/
struct Arr *parr = &arr;
init_arr(parr,8); /*初始化数组*/
show_arr(parr);
printf("尾部添加\n");
append_arr(parr,2);
append_arr(parr,33);
append_arr(parr,41);
append_arr(parr,5);
append_arr(parr,62);
append_arr(parr,7);
show_arr(parr);
printf("动态插入\n");
insert_arr(parr,7,0);
show_arr(parr);
printf("删除\n");
int val; /*为删除元素准备个变量*/
if(delete_arr(parr,2,&val)) {
printf("删除成功,删除元素为%d\n",val);
}else{
printf("删除失败\n");
}
show_arr(parr);
printf("倒序--------\n");
inversion_arr(parr);
show_arr(parr);
printf("排序--------\n");
sort_arr(parr);
show_arr(parr);
append_arr(parr,42);
append_arr(parr,8);
append_arr(parr,14);
printf("快速排序--------\n");
quicksort_arr(parr,0,8);
show_arr(parr);
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;
}
/*显示数组*/
void show_arr(struct Arr *pArr){
if(is_empty(pArr)){
printf("数组为空\n");
}else{
for(int i=0;i<pArr->cnt;i++){
printf("%d\n",pArr->pBase[i]);
}
}
}
/*判断数组是否为空*/
bool is_empty(struct Arr *pArr){
if(0==pArr ->cnt)return true;
return false;
}
bool append_arr(struct Arr *pArr,int val){
if(is_full(pArr)){
printf("数组已经满了\n");
return false;
}
(pArr->cnt)++;
pArr->pBase[pArr->cnt -1] = val;
return true;
}
/*判断数组是否已满*/
bool is_full(struct Arr *pArr){
if(pArr->cnt == pArr->len)return true; /*如果数组长度等于分配长度,则返回真*/
return false;
}
/*插入数组元素*/
bool insert_arr(struct Arr *pArr,int pos,int val){
if(is_full(pArr)){
printf("数组已经满了\n");
return false;
}
int i = pArr->cnt;
if(pos<1 || pos > i+1)return false;
for(i;i > pos-1;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 *val){
if(is_empty(pArr)) return false;
int i = pArr ->cnt;
if(pos<1 || pos>i) return false;
*val = pArr->pBase[pos-1];
for(pos;pos<i;pos++){
pArr->pBase[pos-1] = pArr->pBase[pos];
}
(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--;
}
}
/*排序*/
void sort_arr(struct Arr *pArr){
int i,j,t;
for(i=0;i< pArr->cnt;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;
}
}
}
}
/*快速排序*/
void quicksort_arr(struct Arr *pArr,int left,int right){
if(left > right) return;
int i,j,t;
i = left;
j = right;
t = pArr ->pBase[i];
while(i != j){
while(pArr->pBase[j] >= t && i<j){
j--;
}
if(i<j) pArr->pBase[i] = pArr->pBase[j]; /*先右边往左边移,这里填坑到左边基准*/
while(pArr->pBase[i] < t && i<j){
i++;
}
if(i<j)pArr->pBase[j] = pArr->pBase[i]; /*左边和右边比较,填坑到右边*/
}
pArr->pBase[i] = t; /*一段左右下来,把最初始的安排个位置放*/
quicksort_arr(pArr,left,i-1);
quicksort_arr(pArr,i+1,right);
}菜鸟学数据结构之(5)链表的一些算法
#include <stdio.h>
#include <malloc.h> /*内存操作*/
#include <stdlib.h> /*包含了exit函数*/
/*定义线线性表单链表存储结构*/
typedef struct Node{
int data; /*数据域*/
struct Node *pNext; /*指针域*/
} Node,*linkList; /*Node 等价于typedef struct Node , *linkList 等价于typedef struct Node* */
/*创建单链表*/
linkList crrate_list(void);
void traverse_list(linkList ); /*遍历链表*/
bool is_empty(linkList ); /*判断是否为空*/
int length(linkList); /*判断链表长度*/
void sort_list(linkList); /*排序*/
bool insert_list(linkList,int pos,int val); /* 向链表的pos的前面插入一个新节点,节点内容是val,并且pos是1开始*/
bool delete_list(linkList,int pos,int*); /*通过第3个参数指针可以得到删除的数据*/
int main(void)
{
linkList pHead = NULL;
pHead = crrate_list();
if(is_empty(pHead)){
printf("链表为空\n");
}
printf("链表长度为%d\n",length(pHead));
if(insert_list(pHead,4,99)){
printf("99插入成功\n");
};
sort_list(pHead);
int m;
if(delete_list(pHead,4,&m)) {
printf("删除成功,删除数字为%d\n",m);
}else{
printf("删除失败");
}
traverse_list(pHead);
return 0;
}
linkList crrate_list(void){
int len; /*设置链表的长度*/
int i;
int val; /* 用来临时存放用户节点值 */
printf("请输入链表的长度len=");
scanf("%d",&len);
/*先分配个头节点*/
linkList pHead = (linkList)malloc(sizeof(Node));
if(NULL == pHead){
printf("分配内存失败,程序终止!\n");
exit(-1);
}
linkList pwei = pHead; /*定义一个尾节点,指向头节点*/
pwei ->pNext = NULL;
for(i=0;i<len;i++){
printf("请输入第%d节点的值:",i+1);
scanf("%d",&val);
linkList pNew = (linkList)malloc(sizeof(Node));
if(NULL == pNew){
printf("分配内存失败,程序终止!\n");
exit(-1);
}
pNew ->data = val;
pwei ->pNext = pNew;
pNew ->pNext = NULL;
pwei = pNew;
}
return pHead;
}
/*遍历链表*/
void traverse_list(linkList pHead){
linkList p = pHead ->pNext;
while(NULL != p){
printf("%d ",p ->data);
p = p ->pNext;
}
printf("\n");
return;
}
/*判断链表是否为空*/
bool is_empty(linkList pHead){
linkList p = pHead ->pNext;
if(NULL == p) return true;
return false;
}
/*判断链表长度*/
int length(linkList pHead){
linkList p = pHead ->pNext;
int i = 0;
while(NULL != p){
p = p ->pNext;
i++;
}
return i;
}
/*排序*/
void sort_list(linkList pHead){
int t,j,i;
int len = length(pHead);
linkList p,q;
for(i=0,p = pHead ->pNext;i<len-1;i++,p = p ->pNext){
for(j=1+i,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(linkList pHead,int pos,int val){
int i =0;
linkList p = pHead ->pNext;
while(p != NULL && i < pos-1){
p = p ->pNext;
i++;
}
if(p == NULL || i > pos-1) return false;
linkList pNew = (linkList)malloc(sizeof(Node));
if(NULL == pNew){
printf("分配内存失败,程序终止!\n");
exit(-1);
}
pNew ->data = val;
linkList q = p ->pNext;
p ->pNext = pNew;
pNew ->pNext = q;
return true;
}
bool delete_list(linkList pHead,int pos,int* pval){
int i =0;
linkList p = pHead ->pNext;
while(p != NULL && i < pos-1){
p = p ->pNext;
i++;
}
if(p == NULL || i > pos-1) return false;
linkList q = p ->pNext;
*pval = q ->data;
p ->pNext = p ->pNext ->pNext;
free(q);
q = NULL;
return true;
}