C语言----链表及其应用

这篇博客介绍了C语言中的链表基础知识,包括链表的定义、特点以及单向链表的应用,如队列和堆栈。文章通过三个习题详细讲解了链表的插入、删除以及如何使用链表实现十进制转任意进制、输入字符反序输出和按价格排序书目。
摘要由CSDN通过智能技术生成

             本部分是C语言的最后一部分,因为教研室的一些工作,导致了我的进度滞后,在此对自己提出批评。

 

1、链表的定义:特点:按需分配存储单元,物理地址不连续           单向链表分为  队列 和 堆栈

2、链表的插入和删除;

====================================================================================

习题训练:

1、设计一个程序,将十进制转化为任何进制数;

#include <stdio.h>
#include <stdlib.h>
struct  obj
{
    struct obj *link;
    int a;
};
struct obj *createlink(int x)
{
    struct obj *p,*head;
    int m,n;
    head=NULL;
    printf("请输入要转换的进制: ");
    scanf("%d",&n);
    while(x){
        m=x%n;
        p=(struct obj *)malloc(sizeof(struct obj));              //申请一个链表p,p的a部分赋值为m,p 的头部分为head。。
        p->a=m;
        p->link=head;
        head=p;
        x=x/n;
    }
    return (head);
}
int outlink(struct obj *p)
{
    while(p){
        printf("%d",p->a);
        p=p->link;
    }
    printf("\n");
    return 0;
}
int main()
{
    struct obj *head;
    int num;
    printf("请输入一个数:");
    scanf("%d",&num);
    head = createlink(num);
    outlink(head);
    return 0;
}

//思想:将要转换的数x除以要转换的进制,取余数放入链表,动态申请,商进行循环。。。

2、建立一个链表,从键盘上输入字符,输入字符为'0'时停止,然后反序输出。

#include <stdio.h>
#include <stdlib.h>
struct  obj
{
    struct obj *link;
    char ch;
};
struct obj *createlink()
{
    struct obj *p,*head;
    char c;
    head=NULL;
    while((c=getchar())!='0')
    {
        if((p=(struct obj *)malloc(sizeof(struct obj)))==NULL){
            printf("堆栈溢出\n");
            break;
        }
        p->ch=c;
        p->link=head;
        head=p;
    }
    return head;

}
int outlink(struct obj *p)
{
    while(p){
        printf("%c",p->ch);
        p=p->link;
    }
    printf("\n");
    return 0;
}
int main()
{
    struct obj *head;
    printf("请输入一个字符,以0结束:");
    head = createlink();
    outlink(head);
    return 0;
}

//与上题写函数的方法相似,先写一个创建链表的函数,在创建的过程中,就按照要求对链表里面内容进行赋值,然后写一个打印链表的函数。这里涉及到了单向链表 堆栈的存储结构,特点是先进后出。先存入的元素最后打印,这样就实现了题目中要求的倒序的要求。

 3、用链表的方式,输入若干书的书名和单价,输入的单价为‘0’时停止输入,然后按单价进行排序后输出。

#include <stdio.h>
#include <stdlib.h>
struct obj
{
    struct obj *link;
    char bookname[40];
    int price;
};
struct obj *createlink()
{
    struct obj *p,*head;
    char name[40];
    int pr;
    printf("请输入书名:");
    scanf("%s",&name);
    printf("请输入书的价格:");
    scanf("%d",&pr);
    head=NULL;
    while(pr!=0)
    {
        if((p=(struct obj *)malloc(sizeof(struct obj)))==NULL){
            printf("堆栈溢出\n");
            break;
        }
      strcpy(p->bookname,name);
       p->price=pr;
       p->link=head;
        printf("请输入书名:");
        scanf("%s",&name);
        printf("请输入书的价格:");
        scanf("%d",&pr);

    }
    return (head);

}
int outlink(struct obj *p)
{
    struct obj *head,*q;
    int tt;
    char aa[40];
    head=p;
    while(p!=NULL){
    q=p->link;
    while(q!=NULL){
        if((p->price)>(q->price)){
            strcpy(aa,(q->bookname));
            tt=q->price;
            strcpy((q->bookname),(p->bookname));
            q->price=p->price;
            strcpy((p->bookname),aa);
            p->price=tt;
        }
        q=q->link;
    }
    p=p->link;
    }
    while(head){
        printf("%s",head->bookname);
        printf("   %d",head->price);
        head=head->link;
    }
    printf("\n");
    return 0;
}
int main()
{
    struct obj *head;
    head = createlink();
    outlink(head);
    return 0;
}

4、编写函数creat,用来建立一个单链表,新产生的结点总在链表的末尾,单链表的头指针作为函数值返回。

struct obj *createlink()
{
    struct obj *p,*head,*q;
    char name[40];
    int pr;
    printf("请输入书名:");
    scanf("%s",&name);
    printf("请输入书的价格:");
    scanf("%d",&pr);
    head=NULL;
    while(pr!=0)
    {
        if((p=(struct obj *)malloc(sizeof(struct obj)))==NULL){
            printf("堆栈溢出\n");
            break;
        }
      strcpy(p->bookname,name);
       p->price=pr;
       p->link=head;
       q->link=p;
       q=p;
        printf("请输入书名:");
        scanf("%s",&name);
        printf("请输入书的价格:");
        scanf("%d",&pr);

    }
    return (head);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值