c/c++练习–17
- 习题来源:C语言经典编程282例
161.创建单向链表
创建一个简单的链表,并将这个链表中的数据输出到窗体上
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct List_my {
int num;
struct List_my* next;
};
struct List_my* create_list(void){
struct List_my *head,*next,*new_node;
head = (struct List_my *)calloc(1,sizeof(struct List_my));
if(!head) exit(0);
printf("please input a number:");
scanf("%d",&(head->num));
next = head;
for(int i=0;i<4;i++){
new_node = (struct List_my *)calloc(1,sizeof(struct List_my));
printf("please input a number:");
scanf("%d",&(new_node->num));
new_node->next=NULL;
next->next = new_node;
next = new_node;
}
return(head);
}
int main(void){
struct List_my *head,*p;
p=head = create_list();
while(p){
printf("%d ",p->num);
head = p->next;
free(p);
p=head;
}
return(EXIT_SUCCESS);
}
162.创建双向链表
本实例实现创建一个双向链表,并将这个链表中的数据输出到窗体上,输入要查找的学生姓名,将查找的学生姓名从链表中删除,并显示删除后的链表
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct List_my {
char name[20];
struct List_my *next, *per;
};
struct List_my* create_list(void){
struct List_my *head,*next,*new_node;
head = (struct List_my *)calloc(1,sizeof(struct List_my));
if(!head) exit(0);
printf("please input a number:");
scanf("%s",&(head->name));
next = head;
head->per = NULL;
for(int i=0;i<4;i++){
new_node = (struct List_my *)calloc(1,sizeof(struct List_my));
printf("please input a number:");
scanf("%s",new_node->name);
new_node->next=NULL;
new_node->per = next;
next->next = new_node;
next = new_node;
}
return(head);
}
int find_name( struct List_my *head, char *n ){
struct List_my *pre=head, *next=head;
while(strcmp(next->name, n)){
pre = next;
next=pre->next;
}
pre->next = next->next;
next->next->per = pre;
free(next);
return(0);
}
int main(void){
struct List_my *head,*p;
p=head = create_list();
while(p){
printf("%s ",p->name);
p = p->next;
}
find_name(head,"bc");
p=head;
while(p){
printf("%s ",p->name);
head = p->next;
free(p);
p=head;
}
return(EXIT_SUCCESS);
}
163.创建循环链表
本实例实现创建一个循环链表,这里只创建一个简单的循环链表来演示链表的创建和输出方法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct List_my {
char name[20];
struct List_my *next;
};
struct List_my* create_list(void){
struct List_my *head,*next,*new_node;
head = (struct List_my *)calloc(1,sizeof(struct List_my));
if(!head) exit(0);
printf("please input a number:");
scanf("%s", head->name);
next = head;
for(int i=0;i<4;i++){
new_node = (struct List_my *)calloc(1,sizeof(struct List_my));
printf("please input a number:");
scanf("%s",new_node->name);
new_node->next = head;
next->next = new_node;
next = new_node;
}
return(head);
}
int main(void){
struct List_my *head,*p,*n;
p=head = create_list();
printf("%s ",p->name);
p=p->next;
while(p!=head){
printf("%s ",p->name);
p=p->next;
}
p = head->next;
while(p!=head){
n=p->next;
free(p);
p=n;
}
free(head);
return(EXIT_SUCCESS);
}
164.使用头插入法建立单链表
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct List_my {
char name[20];
struct List_my *next;
};
struct List_my* create_list(void){
struct List_my *head,*next,*new_node;
head = (struct List_my *)calloc(1,sizeof(struct List_my));
if(!head) exit(0);
printf("please input a number:");
scanf("%s", head->name);
next = head;
next->next = NULL;
for(int i=0;i<4;i++){
new_node = (struct List_my *)calloc(1,sizeof(struct List_my));
printf("please input a number:");
scanf("%s",new_node->name);
new_node->next = next;
next = new_node;
}
head = next;
return(head);
}
int main(void){
struct List_my *head,*p,*n;
p=head = create_list();
printf("%s ",p->name);
p=p->next;
while(p){
printf("%s ",p->name);
p=p->next;
}
p = head->next;
while(p){
n=p->next;
free(p);
p=n;
}
free(head);
return(EXIT_SUCCESS);
}
165.双链表逆序输出
创建一个指定节点数的双向链表,并将双链表中的节点数据逆序输出。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct List_my {
char name[20];
struct List_my *n,*p;
};
struct List_my* create_list(void){
struct List_my *head,*next,*new_node;
head = (struct List_my *)calloc(1,sizeof(struct List_my));
if(!head) exit(0);
printf("please input a number:");
scanf("%s", head->name);
next = head;
next->n = NULL;
next->p = NULL;
for(int i=0;i<4;i++){
new_node = (struct List_my *)calloc(1,sizeof(struct List_my));
printf("please input a number:");
scanf("%s",new_node->name);
new_node->n = NULL;
new_node->p = next;
next->n = new_node;
next = new_node;
}
return(head);
}
int main(void){
struct List_my *head,*p,*n;
p=head = create_list();
p=p->n;
while(p) {
n=p;
p =p->n;
}
p=n;
while(p){
printf("%s ",p->name);
p=p->p;
}
p = head->n;
while(p){
n=p->n;
free(p);
p=n;
}
free(head);
return(EXIT_SUCCESS);
}
166.约瑟夫环
使用循环链表实现约瑟夫环,给定一组编号分别是4,7,5,9,3,2,6,1,8.报数初始值为4.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct List_my {
char num;
struct List_my *n;
};
struct List_my* create_list(void){
struct List_my *head,*next,*new_node;
int anum[9]={4,7,5,9,3,2,6,1,8};
head = (struct List_my *)calloc(1,sizeof(struct List_my));
if(!head) exit(0);
next = head;
next->num = *anum;
next->n =head;
for(int i=1;i<9;i++){
new_node = (struct List_my *)calloc(1,sizeof(struct List_my));
new_node->n = head;
new_node->num = anum[i];
next->n = new_node;
next = new_node;
}
return(head);
}
void Joseph(struct List_my *head, int num){
struct List_my *n,*cur;
int i=0;
cur = n = head;
while(n != n->n){
if(i%4 == 3){
printf("\n%d ", n->num);
cur->n = n->n;
free(n);
n = cur->n;
i=0;
}
else{
i++;
cur =n;
n=n->n;
}
}
}
int main(void){
struct List_my *head,*p;
p=head = create_list();
do{
printf("%d ",p->num);
p=p->n;
} while(p!=head);
Joseph(head, 4);
return(EXIT_SUCCESS);
}
167.创建顺序表并插入元素
创建一个顺序表,在顺序表中插入元素,并输出到窗体上
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int num[20];
int length_l;
}List_my,*pList_my;
void insert(pList_my l, int num,int Id){
if(Id <0&&Id>l->length_l+1){
printf("wrong\n");
exit(0);
}
l->num[Id-1] = num;
l->length_l++;
}
int main(void){
List_my l;
insert(&l, 12,1);
insert(&l, 13,2);
insert(&l, 12,3);
insert(&l, 13,4);
for(int i=0;i<=l.length_l;i++)
printf("%d ",l.num[i]);
return(EXIT_SUCCESS);
}
168.合并两个链表
将两个链表合并,合并后的链表为原来两个链表的连接,即将第二个链表直接连接到第一个链表的尾部,合成为一个链表
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct List_my {
int num;
struct List_my* next;
};
struct List_my* create_list(void){
struct List_my *head,*next,*new_node;
head = (struct List_my *)calloc(1,sizeof(struct List_my));
if(!head) exit(0);
printf("please input a number:");
scanf("%d",&(head->num));
next = head;
for(int i=0;i<4;i++){
new_node = (struct List_my *)calloc(1,sizeof(struct List_my));
printf("please input a number:");
scanf("%d",&(new_node->num));
new_node->next=NULL;
next->next = new_node;
next = new_node;
}
return(head);
}
void com_list(struct List_my* l1,struct List_my *l2){
struct List_my *n=l1;
if(l1 && l2){
while(n->next) n = n->next;
n->next = l2;
}
}
int main(void){
struct List_my *head1,*p,*head2;
p=head1 = create_list();
printf("\n");
head2 = create_list();
com_list(head1,head2);
while(p){
printf("%d ",p->num);
head1 = p->next;
free(p);
p=head1;
}
return(EXIT_SUCCESS);
}
169.单链表节点逆置
创建一个单链表,并将链表的节点逆置,将逆置后的链表输出在窗体上
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct List_my {
int num;
struct List_my* next;
};
struct List_my* create_list(void){
struct List_my *head,*next,*new_node;
head = (struct List_my *)calloc(1,sizeof(struct List_my));
if(!head) exit(0);
printf("please input a number:");
scanf("%d",&(head->num));
next = head;
for(int i=0;i<4;i++){
new_node = (struct List_my *)calloc(1,sizeof(struct List_my));
printf("please input a number:");
scanf("%d",&(new_node->num));
new_node->next=NULL;
next->next = new_node;
next = new_node;
}
return(head);
}
struct List_my* inv_list(struct List_my* l1){
struct List_my *n=l1, *pre=NULL,*p=l1;
while(n){
p=n->next;
n->next = pre;
pre = n;
n= p;
}
return(pre);
}
int main(void){
struct List_my *head1,*p;
p=head1 = create_list();
p= head1=inv_list(head1);
while(p){
printf("%d ",p->num);
head1 = p->next;
free(p);
p=head1;
}
return(EXIT_SUCCESS);
}
170.应用栈实现进制转换
应用栈实现进制转换,可以将十进制数转换为其他进制数
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 100
typedef struct stcak{
int len;
int *top, *base;
}sStack,*psStack;
psStack create_list(void){
psStack head;
head = (psStack)calloc(1,sizeof(sStack));
if(!head) exit(0);
head->len = LENGTH;
head->base = (int*)calloc(1, LENGTH);
head->top = head->base;
return(head);
}
int is_empty(psStack s){
if(s->base == s->top )return(1);
return 0;
}
int is_full(psStack s){
if(s->top - s->base >= LENGTH) return(1);
return 0;
}
void push(psStack s, int num){
if(!is_full(s)) *s->top++ = num;
else printf("wrong\n");
}
int pop(psStack s){
if(is_empty(s)) printf("void\n");
else return(*s->top--);
}
void conv(psStack s, int num,int b){
while(num){
push(s, num%b);
num /=b;
}
while(s->top != s->base )
printf("%d", *--s->top);
}
int main(void){
psStack s;
int num, b;
s = create_list();
printf("please input a num:");
scanf("%d %d", &num,&b);
conv(s,num,b);
return(EXIT_SUCCESS);
}