c/c++练习–17

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);
}                                                   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值