编辑: 人间点评 | 2019-09-12 |
一、单链表的基本操作 每一个函数的功能:建立单链表、输出单链表、查找值为X的结点、查找Q的前驱P、插入值为X的R结点、删除Q结点、 建立的链表为双向循环链表 #include"stdio.
h" #include"alloc.h" typedef struct lnode { char value;
struct lnode *link;
}llistnode;
llistnode *creat() { llistnode *head,*p;
char ch;
head=(llistnode *)malloc(sizeof(llistnode));
head->link=NULL;
printf("input:");
while((ch=getchar())!='n') { p=malloc(sizeof(llistnode));
p->value=ch;
p->link=head->link;
head->link=p;
} return head;
} void print(llistnode *head) { llistnode *p;
printf("n");
p=head->link;
while(p) { printf("%c",p->value);
p=p->link;
} } llistnode *visitll(llistnode *h,char x) { llistnode *p;
p=h;
while((p->value!=x)&&(p!=NULL)) p=p->link;
return(p);
} llistnode *predall(llistnode *h,llistnode *q) { llistnode *p;
if(q==h) p=NULL;
else { p=h;
while((p->link!=q)&&(p!=NULL)) p=p->link;
} return(p);
} void insertll(llistnode *h,llistnode *q,char x) { llistnode *p,*r;
r=(llistnode *)malloc(sizeof(llistnode));
r->value=x;
if(h==q) h=r;
else { p=predall(h,q);
p->link=q;
} } void deletell(llistnode *h,llistnode *q) { llistnode *p;
if(h==q) h=q->link;
else { p=predall(h,q);
p->link=q->link;
} free(q);
} main() { llistnode *a;
llistnode *result=NULL;
int choice;
char data,data_cz;
a=creat();
while(1) { printf("n以下是单链表的应用,请选择:");
printf("n1:遍历链表并输出其的结点值: ");
printf("n2: 在链表中查找是否存在某结点 ");
printf("n3: 在链表中查找某结点的前驱 ");
printf("n4: 在链表中查找某结点的后距 ");
printf("n5: 在链表中插入结点 ");
printf("n6: 在链表中删除结点 ");
printf("n7: 退出");
scanf("%d",&choice);
switch(choice) { case 1: print(a);
break;
case 2: getchar();
printf("请输入待查结点的值: ");
data=getchar();
result=visitll(a,data);
if(result!=NULL) printf("%c在链表中",data);
else printf("%c不在链表中",data);
result=NULL;
break;
case 3: getchar();
printf("请输入待查结点 ");
data=getchar();
result=visitll(a,data);
if(result==NULL) { printf("%c不在链表中",data);
break;
} result=predall(a,result);
if(result!=NULL) printf("%c的前驱是%c",data,result->value);
else printf("%c没有前驱",data);
result=NULL;
break;
case 4: getchar();
printf("请输入待查结点的值 ");
data=getchar();
result=visitll(a,data);
if(result==NULL) { printf("%c不在链表中",data);
break;
} if(result->link!=NULL) printf("%c的后距是",data);
result=NULL;
break;
case 5: getchar();
printf("请输入待查结点的值 ");
data=getchar();
getchar();
printf("9请输入插入在哪个结点前面 ");
data_cz=getchar();
result=visitll(a,data_cz);
if(result==NULL) { printf("%c不在链表中",data);
break;
} insertll(a,result,data);
break;
case 6: getchar();
printf( "请输入删除结点的值 ");
data=getchar();
result=visitll(a,data);
if(result==NULL) { printf("%c不在链表中",data);
break;
} deletell(a,result);
break;
case 7: break;
default: break;
} if(choice==7) break;
} }
二、用单链表编制集合运算的程序 #include "stdio.h" #include "alloc.h" #include "string.h" #define max
100 int n;
struct node { char data;
struct node *next;
};
typedef struct node chnode;
chnode *creat() { chnode *head,*p,*q;
char str[25];
int i;
printf("input a string :n");
scanf("%s",str);
if(!strlen(str)) printf("there is no list.n");
for(i=0;
str[i]!=' ';
i++) { if(i==0) head=p=malloc(sizeof(chnode));
q=malloc(sizeof(chnode));
p->next=q;
p=q;
p->data=str[i];
} p->next=NULL;
return (head);
} void print(chnode *head) { chnode *p;
p=head->next;
if(!p) printf("the list is empty!n");
while(p) { printf("%c", p->data);
p=p->next;
} printf("n");
} chnode *sort(chnode *head) { chnode *p,*q,*p1,*p2,*h;
char ch;
h=(chnode *)malloc(sizeof(chnode));
h->next=NULL;
if(!head->next) printf("there is no list!n");
while(head->next!=NULL) {p=head->next;
ch=p->data;
p=p->next;
while(p) { if(p->datadata;
p=p->next;
} p1=head;
p2=head->next;
while((p2->data!=ch)&&p2) { p1=p2;
p2=p2->next;
} if(p2) { p1->next=p2->next;
q=h;
while(q->next) q=q->next;
q->next=p2;
p2->next=NULL;
} } print(h);
return(h);
} chnode *add(chnode *head1,chnode *head2) { chnode *p1,*p2;
p1=head1->next;
while(p1->next) p1=p1->next;
p1->next=head2->next;
head1=sort(head1);
p1=head1->next;
p2=p1->next;
while(p2) { if(p1->data==p2->data) { p1->next=p2->next;
free(p2);
} p2=p2->next;
} return(head1);
} chnode *or(chnode *head1,chnode *head2) { chnode *p1,*p2,*q2,*h,*p;
h=p=malloc(sizeof(chnode));
p->next=NULL;
p1=head1->next;
while(p1) { p2=head2;
q2=p2->next;
while((q2->data!=p1->data)&&q2) { p2=q2;
q2=q2->next;
} if(p1->data==q2->data) p2->next=q2->next;
if(q2) { while(p->next) p=p->next;
p->next=q2;
p=q2;
q2->next=NULL;
} p1=p1->next;
} return(h);
} chnode *sub(chnode *head1,chnode *head2) { chnode *p1,*p2,*q1;
p2=head2->next;
while(p2) { p1=head1;
q1=p1->next;
while(q1) { while((q1->data!=p2->data)&&(q1)) { p1=q1;
q1=q1->next;
} if(p2->data==q1->data) { p1->next=q1->next;
free(q1);
} p1=q1;
q1=q1->next;
} p2=p2->next;
} head1=sort(head1);
return(head1);
} main() { int flag;
chnode *str1,*str2,*str;
str1=creat(str1);
str2=creat(str2);
printf("运算前 str1 为:");
print(str1);
printf("n");
printf("运算前 str2 为:");
print(str2);
printf("n");
while(1) { printf("n1: 并运算: ");
printf("n2: 交运算: ");
printf("n3: 差运算: ");
printf("n4: 退出: ");
printf("请输入选择 :");
scanf("%d",&flag);
switch(flag) { case 1: str1=add(str1,str2);
print(str);
break;
case 2: str1=or(str1,str2);
print(str);
break;
case 3: str1=sub(str1,str2);
print(str);
break;
case 4: break;
} if(flag==4) break;
} }
三、用数组实现两个非稀疏矩阵的相乘运算. #include "stdio.h" #define N
6 int r[N][N];
void mult(int a[N][N],int b[N][N]) { int i,j,k;
for(i=0;
idata=ch;
bt->lchild=creat();
bt->rchild=creat();
} else bt=NULL;
return bt;
} void level(blink bt) { blink p;
p=bt;
initq(q);
if(p) { printf("%c",p->data);
enq(q,p);
} while(!qempty(q)) { p=deq(q);
if(p->lchild) { printf("%c",p->lchild->data);
enq(q,p->lchild);
} if(p->rchild) { printf("%c",p->rchild->data);
enq(q,p->rchild);
} } } main() { blink root;
root=creat();
printf("n");
level(root);
printf("n");
}
五、快速排序 #include "stdio.h" #define max
100 int r[max];
void quicksortl(int r[],int s,int t) { int i,j;
i=s;
j=t;
r[0]=r[s];
while(inext=a.arry[x].first;
a.arry[x].first=p;
c++;
} }while(x>0);
a.arry[i].have=c;
} return a;
} /*void disp(md a) { node *p;
int i;
for(i=1;
inumber].vex_num);
p=p->next;
} printf("n");
} } */ void select(int quee[],int i,int j,md a) /* 该函数的目的是使课程集中在前面 */ { /* 从下标i到j扫描数组quee,将学分最少的编号与quee[i]交换 */ int k,temp,min;
min=i;
for(k=i+1;
knext;
} } else /* 已学课程的学分超过了上限 */ { total_score=0;
printf("n%d term study:",j++);
} } } main() { md h;
h=init();
/* disp(h);
*/ arrage(h);
getch();
} 程序实现: enter class total:12 enter term total:
6 enter socre limit:10 enter class arrange enter
1 class number and score:1
2 enter
1 prior class:0 enter
2 class number and score:2
3 enter
2 prior class:1
0 enter
3 class number and score:3
4 enter
3 prior class:1
2 0 enter
4 class number and score:4
3 enter
4 prior class:1
0 enter
5 class number and score:5
2 enter
5 prior class:3
4 0 enter
6 class number and score:6
3 enter
6 prior class:11
0 enter
7 class number and score:7
4 enter
7 prior class:5
3 0 enter
8 class number and score:8
4 enter
8 prior class:3
6 0 enter
9 class number and score:9
7 enter
9 prior class:0 enter
10 class number and score:10
5 enter
10 prior class:9
0 enter
11 class number and score:11
2 enter
11 prior class:9
0 enter
12 class number and score:12
3 enter
12 prior class:9
10 1
0 1 term study:1
4 2
2 term study:3
5 7
3 term study:9
11 4 term study:6
8 5 term study:10
12 五.成绩分析问题 [问题描述] 录入、保存一个班级学生多门课程的成绩,并对成绩进行分析. [基本要求] (1)通过键盘输入各学生的多门课程的成绩,建立相应的文件input.dat. (2)对文件input.dat中的数据进行处理,要求具有如下功能: 1)按各门课程成绩排序,并生成相应的文件输出. 2)计算每人的平均成绩,按平均成绩排序,并生成文件. 3)求出各门课程的平均成绩、最高分、最低分、不及格人数、60~69分人数、70~79分人数、80~89分人数、90分以上人数. 4)根据姓名或学号查询某人的各门课成绩,重名情况也能处理. (3)界面美观. #define maxsize1
100 /* maxsize1为学生名字的最大字符数 */ #define maxsize2
10 /* maxsize2为学生的最大个数 */ typedef struct { int number;
/* 学号域 */ char name[maxsize1];
/* 姓名域 */ int pro[5];
/* pro[1]为math成绩,pro[2]为english成绩,pro[3]为computer成绩,pro[4]为平均成绩 */ }node;
typedef struct { node stu[maxsize2];
/* 存放学生信息 */ int num;
/* 存放学生人数 */ }md;
md creat() /* 创建学生信息 */ { md a;
int i;
printf("enter student ON.:");
scanf("%d",&a.num);
for(i=1;
i