这个代码怎么改成用链表写?跪求

#include
#include
#include
#define N 100

typedef struct Books {
char num[20];
char name[20];
char author[20];
int price;
int total;
char introduce[50];

}ppz;
ppz ppz[N];

void Addppz(ppz *p, int i);
void deleteppz(char ppzNum[]);
void judge(int jdg);
void paixu(ppz ppz[], int n);
void swapmessage(ppz *p, ppz *q);
void outputInfo(ppz *p);
void updatebook(char ppzNum[]);
void Searchbook(char ppzNum[]);

int i, tmp=0, flag = 1, menu;
int main() {

while (flag) {
    do {
        printf("------------------------------------------------------------------------------------------\n");
        printf("|                                           Hello                                        |\n");
        printf("|                                 请输入想要实现的功能选项                               |\n");
        printf("|                                       1、录入新书籍                                    |\n");
        printf("|                                       2、删除指定书籍                                  |\n");
        printf("|                                       3、价格从小到大排序书籍                          |\n");
        printf("|                                       4、修改指定书籍                                  |\n");
        printf("|                                       5、查询指定书籍                                  |\n");
        printf("|                                       6、退出                                          |\n");
        printf("------------------------------------------------------------------------------------------\n");
        printf("\n");
        printf("请输入选项:");
        scanf("%d", &menu);
    } while (menu>6 || menu<1);

    judge(menu);

}
getchar(); getchar(); getchar();

}

void judge(int jdg) {
int n;
char ppzNum[20];
switch (jdg) {
case 1:

    printf("请输入要录入书籍的个数:");
    scanf("%d", &n);
    for (i = tmp; i<n + tmp; i++) {
        Addppz(&ppz[i], i);
    }
    tmp = n + tmp;
    break;
case 2:
    printf("请输入要删除的书号:");

    scanf("%s", ppzNum);
    deleteppz(ppzNum);
    break;
case 3:
    paixu(ppz,tmp);
    printf("排序后:\n");
    for (i = 0; i < tmp; i++) {
        outputInfo(&ppz[i]);
    }
    break;
case 4:
    printf("请输入要修改的书号:");

    scanf("%s", ppzNum);
    updatebook(ppzNum);
    break;
case 5:
    printf("请输入要查询的书号:");
    scanf("%s", ppzNum);
    Searchbook(ppzNum);
    break;
case 6:
    flag = 0;
    break;
}

}

void Addppz(ppz *p, int i) {

printf("请录入第%d本书:\n",i+1);
printf("请输入书号:");
scanf("%s",p->num);
printf("请输入书名:");
scanf("%s", p->name);
printf("请输入作者:");
scanf("%s", p->author);
printf("请输入单价:");
scanf("%d", &(p->price));
printf("请输入数量:");
scanf("%d", &(p->total));
printf("请输入简介:");
scanf("%s", p->introduce);

}
void deleteppz(char ppzNum[]) {

int index=0;
for (i = 0; i<tmp; i++) {
    if (strcmp(ppzNum, ppz[i].num) == 0) {
        for (int j = i; j<tmp - 1; j++) {
            strcpy(ppz[j].num ,ppz[j + 1].num);
            strcpy(ppz[j].name, ppz[j + 1].name);
            strcpy(ppz[j].author, ppz[j + 1].author);
            strcpy(ppz[j].introduce, ppz[j + 1].introduce);
            ppz[j].price = ppz[j].price;
            ppz[j].total = ppz[j].total;

            tmp = tmp - 1;
            index = 1;
            break;
        }
    }
}

if (index) {
    printf("已经删除该书籍信息\n");
}else {
    printf("没有找到该书籍\n");
}

}
void paixu(ppz ppz[],int n) {
int i, j;
for (i = 0; i < n - 1;i++) {
for (j = 0; j < n - 1-i;j++) {
if (ppz[j].price > ppz[j+1].price) {
swapmessage(&ppz[j],&ppz[j+1]);
}
}
}

}
void swapmessage(ppz *p,ppz *q) {
ppz trmp;
trmp = *p; *p = *q; *q = trmp;
}
void outputInfo(ppz *p) {

    printf("%s\t%s\t%s\t%d\t%d\t%s\n", p->num, p->name, p->author, p->price, p->total, p->introduce);

}

void updatebook(char ppzNum[]) {

int index = 0;
for (i = 0; i<tmp; i++) {
    if (strcmp(ppzNum, ppz[i].num) == 0) {

        printf("请修改图书馆第%d本书:\n", i + 1);
        printf("请修改书号:");
        scanf("%s", ppz[i].num);
        printf("请修改书名:");
        scanf("%s", ppz[i].name);
        printf("请修改作者:");
        scanf("%s", ppz[i].author);
        printf("请修改单价:");
        scanf("%d", &(ppz[i].price));
        printf("请修改数量:");
        scanf("%d", &(ppz[i].total));
        printf("请修改简介:");
        scanf("%s", ppz[i].introduce);

        index = 1;
        break;

    }
}

if (index==1) {
    printf("已经修改该书籍信息\n");
}
else {
    printf("没有找到该名称书籍\n");
}

}
void Searchbook(char ppzNum[]) {

int index = 0;
for (i = 0; i<tmp; i++) {
    if (strcmp(ppzNum, ppz[i].num) == 0) {
        outputInfo(&ppz[i]);
        index = 1;
        break;

    }
}

if (index==1) {
    printf("已经查询到该书籍信息\n");
}
else {
    printf("没有找到该名称的书籍\n");
}

}

1个回答

指针没学好啊。现在代码是采用的线性表,是一个结构体数组
如果要用链表,结构体保留充当 data ,需要再做一个结构体 Node
struct Node{
ppz book ;
int index ;
Node* next ;
};
先初始化一个 head节点 Node* head //自己去开辟内存 那个 malloc函数 然后初始化链表
1.Addppz (Node* head , int i)
采用尾插法比较方便
Node p = head->next ;
while(p !=NULL && p->inex < i) {
p=p->next ; //移动指标相当于你那个 循环角标找位置
}
//当前的 p 就是你要找的插入位置
Node
node = //开辟一个节点 内存,并保存当前要插入的数据
//关键地方:连接链条
node->next = p->next ; //当前node 先将链表从p 后部分接上
p->next = node ;//p在接上 node
}

 链表就是玩的指针,指针中 的 next指针 可以理解为链条,如何拆链 搭链 就是关键
 记住破坏链条之前先保存破坏点的链然后再搭接
 你好好写写
 按照上面思路去写吧,一天你就学会了对你后面c语言学习也很有帮助的
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

0
老师要求对链表的每个信息进行排序,但这个链表排序不会啊,求大神求代码?
1
【链表】为什么用L->Next=NULL就出错
1
C语言求助:输入一个字符串,将其中的字母字符输入一个链表,将其中的数字字符输入另一个链表。
1
把两个有序排列的单向整数链表合并成一个有序排列的的整数链表?
0
链表总是会卡,输入没法按预想输完,跪求指正!!!
1
如何实现 链表的头结点是指针数组,再用二级指针调用?
2
Java语言编写程序一个链表,并且计算链表上所有数的和
3
约瑟夫环 - 2 用数组和链表分别该怎么做啊,求求代码思路
1
c语言链表问题,请问一下我这个代码错在哪里,谢谢了
1
如何用C++创建一个可以存入小数的链表?
2
编写一个函数,实现将一个带头结点的单向链表数据逆置,代码怎么写呀?
1
这是数据结构一个简单的链表问题
2
这是 一个关于数据结构的链表问题
1
今年刚刚学的C语言,没有学过链表希望大佬可以帮忙写一下源代码,谢谢了
2
这是我写关于数据结构链表初始化功能的一个代码
2
这是一个关于数据结构链表的相关问题
4
这是一个关于数据结构链表 前插法 的指针内容问题
0
Java语言设计实现一个链表的数据结构,不要使用现有的库的代码,并且插入5个数字再输出
2
这是一个关于数据结构链表结点的相关问题
2
这是一个关于链表结点的指针问题