c语言链表排序问题(非交换成员)

struct scool student{
char name[10];
int score;
}
从键盘获取输入,创建这样一个链表。
然后按照成绩值进行降序排序(交换链表中结构体位置而不是成员值)怎么实现。我通过冒泡排序for(one=head;one!=NULL;one=one->next)
for(two=one->next;two!=NULL;two=two->next)
{ if()
{......}
}
一直实现不了,不知道哪里出问题。

1个回答

如果是单向链表,你需要存取需要交换的两个元素的前驱节点。
假设需要交换的是p q,前驱分别是a b,那么交换的代码如下
node * t = b->next;
b ->next = a ->next;
a -> next = t;
t = p->next;
p->next = q->next;
q->next = t;

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
求助,关于c语言链表排序的问题

做了两个链表 每个节点内有一个学生的编号和成绩,现在要求把两个链表合并,然后按照学号升序排列 不知道为啥 第65行总是报错 我整了一个小时了 没发现哪里错了,貌似运行时候显示说我引用了一个不可以引用的地址?求助大神谢谢了 ``` #include <stdio.h> #include <stdlib.h> #define LEN sizeof(struct Person) struct Person { int num; float score; struct Person *next; }; struct Person *createPerson(); void printLink(struct Person *); struct Person *merge(struct Person *, struct Person *); struct Person *mergeAndSort(struct Person *, struct Person *); void sort(struct Person *[], int); int main() { struct Person *p1 = createPerson(); struct Person *p2 = createPerson(); // struct Person *pPerson = merge(p1, p2); struct Person *pPerson = mergeAndSort(p1, p2); printLink(pPerson); return 0; } void sort(struct Person *arr[], int n) { struct Person *tmp; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { if (arr[i]->num > arr[j]->num) { //swap tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } } } } struct Person *mergeAndSort(struct Person *a, struct Person *b) { struct Person *arr[64]; struct Person *head; int i = 0, x; while (a != NULL) { arr[i] = a; a = a->next; i++; } while (b != NULL) { arr[i] = b; b = b->next; i++; } sort(arr, i); //reCreateLink head = arr[0]; head->next = arr[1]; for (x = 1; x < i - 1; x++) { (arr[i])->next = arr[i + 1]; } arr[x]->next = NULL; return head; } struct Person *merge(struct Person *a, struct Person *b) { struct Person *tmp = a; while (tmp->next != NULL) { tmp = tmp->next; } tmp->next = b; return a; } void printLink(struct Person *p) { while (p != NULL) { printf("%d\t%f\n", p->num, p->score); p = p->next; } } struct Person *createPerson() { struct Person *p1, *p2, *head; p1 = p2 = (struct Person *) malloc(LEN); scanf("%d %f", &p1->num, &p1->score); int size = 0; while (p1->num != 0) { size++; if (size == 1) { head = p1; } else { p2->next = p1; } p2 = p1; p1 = (struct Person *) malloc(LEN); scanf("%d %f", &p1->num, &p1->score); } p2->next = NULL; printf("Establish complete\n"); return head; }; ```

小白请教C语言链表排序的问题?

能不能帮看一下我的排序函数哪里有问题,谢谢! ![图片说明](https://img-ask.csdn.net/upload/2016![图片说明](https://img-ask.csdn.net/upload/201608/27/1472270981_203754.png)08/27/1472270972_5742.png) #include<stdio.h>/*引用库函数*/ #include<string.h> #include<stdlib.h> #include<malloc.h> struct Lib/*定义图书信息的结构体变量*/ { char name[10];/*图书名*/ char writter[10];/*作者名*/ char number[10];/*分类号*/ char pub[10];/*出版社*/ char time[10];/*出版时间*/ char price[10];/*价格*/ struct Lib* next; }; #define LEN sizeof(struct Lib) struct Lib* head = NULL;/*头指针为空*/ /*函数声明*/ void input();/*图书信息录入函数*/ void output();/*图书信息浏览函数*/ void out();/*退出系统函数*/ void menu();/*菜单函数*/ int login();/*登录函数*/ void save();/*图书信息保存函数*/ void search();/*图书信息查询函数*/ void del();/*图书信息删除函数*/ void sort();/*图书信息排序函数*/ void modify();/*图书信息修改函数*/ void modify_output();/*图书信息修改后输出函数*/ int main()/*主函数*/ { printf("请输入密码:"); login(); printf("***********菜单***********\n"); menu(); return 0; } int login() { char password[10]; char password1[10] = "admin"; scanf("%s", password); if (strcmp(password, password1) == 0)/*检查密码是否正确*/ printf("密码正确!\n"); else { printf("密码错误!请重试!\n"); login(); } return 1; } void menu() { int n; printf(" ┏━━━━━━━━┓\n"); printf(" ┃1:图书信息录入 ┃\n"); printf(" ┃2:图书信息浏览 ┃\n"); printf(" ┃3:图书信息查询 ┃\n"); printf(" ┃4:图书信息排序 ┃\n"); printf(" ┃5:图书信息删除 ┃\n"); printf(" ┃6:图书信息修改 ┃\n"); printf(" ┃7:退出系统 ┃\n"); printf(" ┗━━━━━━━━┛\n"); printf("请输入选项前对应数字:"); scanf("%d", &n); if (n == 1) { input(); save(); menu(); } else if (n == 2) { output(); menu(); } else if(n==3) search(); else if(n==4) sort(); else if(n==5) del(); else if (n == 6) modify(); else if(n==7) out(); else { printf("输入错误!请重新输入!\n"); menu(); } } void input() { Lib *end; Lib *p1; int isempty = 0;/*标记变量初值*/ if (!head)/*检查head是否为空*/ { end = head = (Lib*)malloc(sizeof(Lib));/*申请新的内存空间*/ isempty = 1;/*改变变量初值*/ head->next = NULL; } else { end = head; while (end->next)/*使end->next为空*/ end = end->next; } char answer[5] = "yes", answer1[5]; if (isempty)/*检查是否已开辟内存空间*/ p1 = head; else p1 = (Lib*)malloc(sizeof(Lib)); printf("书名:"); scanf("%s", p1->name); printf("作者名:"); scanf("%s", p1->writter); printf("分类号:"); scanf("%s", p1->number); printf("出版单位:"); scanf("%s", p1->pub); printf("出版时间:"); scanf("%s", p1->time); printf("价格:"); scanf("%s", p1->price); if (!isempty)/*检查变量初值是否已被改变*/ { end->next = p1; end = p1; end->next = NULL; } printf("是否继续录入?Yes or not\n"); scanf("%s", answer1); while (strcmp(answer1, answer) == 0)/*连续录入图书信息*/ { p1 = (Lib*)malloc(LEN);/*申请新的内存空间*/ printf("书名:"); scanf("%s", p1->name); printf("作者名:"); scanf("%s", p1->writter); printf("分类号:"); scanf("%s", p1->number); printf("出版单位:"); scanf("%s", p1->pub); printf("出版时间:"); scanf("%s", p1->time); printf("价格:"); scanf("%s", p1->price); end->next = p1; end = p1; end->next = NULL; printf("是否继续录入?Yes or not\n"); scanf("%s", answer1); } } void save() { Lib *p = head; FILE *w = fopen("output.txt", "w");/*打开output.txt文件*/ if (!w) { printf("打开文件失败!"); return; } int n = 1; while (p)/*将图书信息保存到output.txt文件中*/ { fprintf(w, "%d: %s %s %s %s %s %s \n", n++, p->name, p->writter, p->number, p->pub, p->time, p->price); p = p->next; } fclose(w); } void output() { Lib *p = head; int n = 1; printf("图书信息如下:\n"); printf("\t书名\t作者名\t分类号\t出版单位\t出版时间\t价格\n"); while (p)/*输出图书信息*/ { printf("%d. %8s %8s %8s %8s %15s %15s \n", n++, p->name, p->writter, p->number, p->pub, p->time, p->price); p = p->next; } } void search() { Lib *p; int n; char book[10],wri[10]; p=head; printf(" ┏━━━━━━━━━━┓\n"); printf(" ┃1:按图书名查询 ┃\n"); printf(" ┃2:按作者名查询 ┃\n"); printf(" ┗━━━━━━━━━━┛\n"); scanf("%d",&n); if(n==1) { printf("请输入图书名:"); scanf("%s",book); while(strcmp(book, p->name)!=0)/*查找相应图书*/ p=p->next; if(p) { printf("图书信息如下:\n"); printf("\t书名\t作者名\t分类号\t出版单位\t出版时间\t价格\n"); printf("%8s %8s %8s %8s %15s %15s \n", p->name, p->writter, p->number, p->pub, p->time, p->price); menu(); } else { printf("没有要查询的图书!\n"); menu(); } } else if(n==2) { printf("请输入作者名:"); scanf("%s",wri); while(strcmp(wri, p->writter)!=0)/*查找相应图书*/ p=p->next; if(p) { printf("图书信息如下:\n"); printf("\t书名\t作者名\t分类号\t出版单位\t出版时间\t价格\n"); printf("%8s %8s %8s %8s %15s %15s \n", p->name, p->writter, p->number, p->pub, p->time, p->price); menu(); } else { printf("没有要查询的图书!\n"); menu(); } } else { printf("输入错误!\n"); menu(); } } void sort() { Lib *p,*pfirst,*ptail,*pmin,*pminBefore; p=head; int n; printf(" ┏━━━━━━━━━━┓\n"); printf(" ┃1:按价格从低到高排序┃\n"); printf(" ┃2:按价格从高到低排序┃\n"); printf(" ┗━━━━━━━━━━┛\n"); printf("请选择排序标准(输入选项前数字):"); scanf("%d",&n); if(n==1) { pfirst = NULL; while (head != NULL) /*在链表中找键值最小的节点。*/ { for (p = head, pmin = head; p->next != NULL; p = p->next) /*循环遍历链表中的节点,找出此时最小的节点。*/ { if (p->next->price < pmin->price) /*找到一个比当前min小的节点。*/ { pminBefore = p; /*保存找到节点的前驱节点*/ pmin = p->next; /*保存键值更小的节点。*/ } } if (pfirst == NULL) /* 如果有序链表目前还是一个空链表 */ { pfirst = pmin; ptail = pmin; } else /* 如果有序链表中已经有节点*/ { ptail->next = pmin; /* 把刚找到的最小节点放到最后*/ ptail = pmin; } if (pmin == head) /* 如果找到的最小节点就是第一个节点*/ { head = head->next; } else /*如果不是第一个节点*/ { pminBefore->next = pmin->next; /*让pmin离开原链表。*/ } } if (pfirst != NULL) /*循环结束得到有序链表first */ { ptail->next = NULL; } int n=1; printf("价格从低到高信息如下:\n"); printf("\t书名\t作者名\t分类号\t出版单位\t出版时间\t价格\n"); while (pfirst)/*输出图书信息*/ { printf("%d. %8s %8s %8s %8s %15s %15s \n", n++, pfirst->name, pfirst->writter, pfirst->number, pfirst->pub, pfirst->time, pfirst->price); pfirst = pfirst->next; } menu(); } else { printf("输入错误!\n"); menu(); } } void del() { Lib *p,*p1; p=head; char book[10]; printf("请输入要删除的图书名:"); scanf("%s",book); while(strcmp(book, p->name)!=0)/*查找相应图书*/ { p1=p; p=p->next; } if(p) { p1->next=p->next; p=head; printf("删除成功!\n现在图书信息如下:\n"); printf("\t书名\t作者名\t分类号\t出版单位\t出版时间\t价格\n"); int n=1; while (p) { printf("%d. %8s %8s %8s %8s %15s %15s \n", n++, p->name, p->writter, p->number, p->pub, p->time, p->price); p = p->next; } menu(); } else { printf("库中没有此图书!\n"); menu(); } } void modify() { Lib *p,*p1; int n; p=head; char a[10]; printf(" ┏━━━━━┓\n"); printf(" ┃1:图书名 ┃\n"); printf(" ┃2:作者名 ┃\n"); printf(" ┃3:分类号 ┃\n"); printf(" ┃4:出版单位┃\n"); printf(" ┃5:出版时间┃\n"); printf(" ┃6:价格 ┃\n"); printf(" ┗━━━━━┛\n"); printf("请选择要修改的信息(输入选项前的数字):\n"); scanf("%d",&n); if(n==1) { printf("原来的图书名是:"); scanf("%s",a); while(strcmp(a, p->name)!=0)/*查找相应图书*/ { p1=p; p=p->next; } if(p) { printf("现在的图书名是:"); scanf("%s",p->name); modify_output();/*输出修改后的图书信息*/ } else { printf("库中没有此图书!\n"); menu(); } } else if(n==2) { printf("原来的作者名是:"); scanf("%s",a); while(strcmp(a, p->writter)!=0) { p1=p; p=p->next; } if(p) { printf("现在的作者名是:"); scanf("%s",p->writter); modify_output(); } else { printf("库中没有此图书!\n"); menu(); } } else if(n==3) { printf("原来的分类号是:"); scanf("%s",a); while(strcmp(a, p->number)!=0) { p1=p; p=p->next; } if(p) { printf("现在的分类号是:"); scanf("%s",p->number); modify_output(); } else { printf("库中没有此图书!\n"); menu(); } } else if(n==4) { printf("原来的出版单位是:"); scanf("%s",a); while(strcmp(a, p->pub)!=0) { p1=p; p=p->next; } if(p) { printf("现在的出版单位是:"); scanf("%s",p->pub); modify_output(); } else { printf("库中没有此图书!\n"); menu(); } } else if(n==5) { printf("原来的出版时间是:"); scanf("%s",a); while(strcmp(a, p->time)!=0) { p1=p; p=p->next; } if(p) { printf("现在的出版时间是:"); scanf("%s",p->time); modify_output(); } else { printf("库中没有此图书!\n"); menu(); } } else if(n==6) { printf("原来的价格是:"); scanf("%s",a); while(strcmp(a, p->price)!=0) { p1=p; p=p->next; } if(p) { printf("现在的价格是:"); scanf("%s",p->price); modify_output(); } else { printf("库中没有此图书!\n"); menu(); } } } void modify_output() { Lib *p; p=head; int c=1; printf("修改成功!\n现在图书信息如下:\n"); printf("\t书名\t作者名\t分类号\t出版单位\t出版时间\t价格\n"); while (p)/*输出修改后的图书信息*/ { printf("%d. %8s %8s %8s %8s %15s %15s \n",c++,p->name, p->writter, p->number, p->pub, p->time, p->price); p = p->next; } menu(); } void out() { printf("退出成功!\n"); }

C语言链表数据输入问题

有链表指针p1,想向结构体中的结构体时间中的变量日输入数值,如何写代码?

关于C语言链表学习入门遇到瓶颈

怎样学习C语言中的链表,有没有什么好的文章博客,详细易懂,发一下链接,谢谢

C语言链表排序后为啥不能输出 求大佬解答

#include<stdio.h> #include<malloc.h> #include<string.h> #include<math.h> #include<stdlib.h> struct people { char name[20]; char phone[30]; char email[30]; struct people *next; }; int main() { struct people * head; struct people *creat(); void sort(struct people *head); head=creat(); sort(head); return 0; } struct people *creat() { struct people * head; struct people *p1,*p2; void save(struct people *p1); int i,n; p1=p2=(struct people*)malloc(sizeof(struct people)); i=1; n=0; head=NULL; printf("请输入:\n"); while(i==1) { printf("姓名:"); scanf("%s",&p1->name); printf("电话:"); scanf("%s",&p1->phone); printf("Email:"); scanf("%s",&p1->email); save(p1); if(n==0) head=p1; else p2->next=p1; p2=p1; p1=(struct people *)malloc(sizeof(struct people)); n=n+1; printf("继续输入请按1,退出请按0.\n"); scanf("%d",&i); } p2->next=NULL; return(head); } void save(struct people *p) { FILE *fp; char name[20]; printf("文件名称:"); scanf("%s",name); if((fp=fopen(name,"wb"))==NULL) { printf("cannot open file\n"); return; } if(fwrite(p,sizeof(struct people),1,fp)!=1) printf("file write error\n"); fclose(fp); } void sort(struct people *head) { struct people *p1,*p2,*tail,*p; tail=NULL; while((head->next->next)!=NULL) { p1=head; p2=head->next; while((p1->next->next)!=NULL) { if(strcmp((p1->name),(p1->next->name))>0) { p1->next=p2->next; p2->next=p2->next->next; p1->next->next=p2; p2=p1->next; } p1=p1->next; p2=p2->next; } tail=p2; } p=head; do {printf("姓名:%s 电话:%s\n",p->name,p->phone); p=p->next; }while(p!=NULL); }

老师要求对链表的每个信息进行排序,但这个链表排序不会啊,求大神求代码?

#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> char ppzz[100] = ""; char lwjj[100] = ""; struct PPZBOOK { char author[1000]; char name[1020]; char isbn[120]; char data[115]; char id[110]; char status[110]; struct PPZBOOK * next; }; struct PPZBOOK * Creat(); void AddBook(struct PPZBOOK * head); void DeleteBook(struct PPZBOOK * head); void PrintBookList(struct PPZBOOK * head); void SearchBook(struct PPZBOOK * head); void SaveBook(struct PPZBOOK * head); struct PPZBOOK * Creat() { struct PPZBOOK * head; head = (struct PPZBOOK *)malloc(sizeof(struct PPZBOOK)); head->next = NULL; return head; } void SaveBook(struct PPZBOOK * head) { struct PPZBOOK *p; FILE *fp; p = head; fp = fopen("books.txt", "w+"); while (p->next != NULL) { p = p->next; fprintf(fp, "|%-6.6s|%-10.10s|%-10.10s|%-10.10s|%-12.12s|%-6.6s|\n", p->id, p->name, p->author, p->isbn, p->data, p->status); } fclose(fp); printf("已将图书数据保存到 books.txt 文件\n"); } void AddBook(struct PPZBOOK *head) { struct PPZBOOK *s, *p; char hihi = 'Y'; p = head; while (p->next != NULL) { p = p->next; } while (hihi == 'Y' || hihi == 'y') { s = (struct PPZBOOK *)malloc(sizeof(struct PPZBOOK)); printf("请输入图书书号: "); fflush(stdin); scanf("%s", s->id); printf("请输入图书书名: "); fflush(stdin); scanf("%s", s->name); printf("请输入图书作者名: "); fflush(stdin); scanf("%s", s->author); printf("请输入图书ISBN: "); fflush(stdin); scanf("%s", s->isbn); printf("请输入图书出版时间: "); fflush(stdin); scanf("%s", s->data); printf("请输入图书状态: "); fflush(stdin); scanf("%s", s->status); p->next = s; p = s; s->next = NULL; printf(" ━━━━ 添加成功!━━━━\n"); printf("继续添加?(Y/N):"); fflush(stdin); scanf("%c", &hihi); if (hihi == 'N' || hihi == 'n') { system("cls"); break; } else if (hihi == 'Y' || hihi == 'y') { system("cls"); continue; } } SaveBook(head); return; } void SearchBook(struct PPZBOOK *head) { struct PPZBOOK * p; p = head; char temp[20]; char ttt[10]; int flog = 0; if (head == NULL || head->next == NULL) { printf(" ━━━━ 图书库为空!━━━━\n"); } else { printf("请输入你要查找的类型\n"); scanf("%s", &ttt); if (strcmp("书名", ttt) == 0) { printf("请输入您要查找的书名: "); fflush(stdin); scanf("%s", &temp); while (p != NULL) { if (strcmp(p->name, temp) == 0) { printf("图书已找到!\n"); printf("书号: %s\t\n", p->id); printf("书名: %s\t\n", p->name); printf("作者名: %s\t\n", p->author); printf("ISBN: %s\t\n", p->isbn); printf("出版时间: %s\t\n", p->data); printf("状态: %s\t\n", p->status); flog = 1; } if (p->next == NULL) { printf("查询完毕!\n"); } p = p->next; } if (flog == 0) { printf("抱歉,你要找的书不存在!\n"); } } else if (strcmp("作者", ttt) == 0) { printf("请输入您要查找的作者: "); fflush(stdin); scanf("%s", &temp); while (p != NULL) { if (strcmp(p->author, temp) == 0) { printf("图书已找到!\n"); printf("书号: %s\t\n", p->id); printf("书名: %s\t\n", p->name); printf("作者名: %s\t\n", p->author); printf("ISBN: %s\t\n", p->isbn); printf("出版时间: %s\t\n", p->data); printf("状态: %s\t\n", p->status); flog = 1; } if (p->next == NULL) { printf("查询完毕!\n"); } p = p->next; } if (flog == 0) { printf("抱歉,你要找的书不存在!\n"); } } else if (strcmp("ISBN", ttt) == 0) { printf("请输入您要查找的ISBN: "); fflush(stdin); scanf("%s", &temp); while (p != NULL) { if (strcmp(p->isbn, temp) == 0) { printf("图书已找到!\n"); printf("书号: %s\t\n", p->id); printf("书名: %s\t\n", p->name); printf("作者名: %s\t\n", p->author); printf("ISBN: %s\t\n", p->isbn); printf("出版时间: %s\t\n", p->data); printf("状态: %s\t\n", p->status); flog = 1; } if (p->next == NULL) { printf("查询完毕!\n"); } p = p->next; } if (flog == 0) { printf("抱歉,你要找的书不存在!\n"); } } } } void PrintBookList(struct PPZBOOK * head) { struct PPZBOOK * p; if (head == NULL || head->next == NULL) { printf(" ━━━━ 没有图书记录! ━━━━\n"); return; } p = head; while (p->next != NULL) { p = p->next; printf("%s %s %s %s %s %s\n", p->id, p->name, p->author, p->isbn, p->data, p->status); } printf("\n"); } void DeleteBook(struct PPZBOOK * head) { struct PPZBOOK *s, *p; char temp[20]; int panduan; panduan = 0; p = s = head; if (head == NULL || head->next == NULL) { printf(" ━━━━ 图书库为空!━━━━\n"); } else { printf("请输入您要删除的书名:"); scanf("%s", temp); while (p != NULL) { if (strcmp(p->name, temp) == 0) { panduan++; break; } p = p->next; } if (panduan == 1) { while (s->next != p) { s = s->next; } s->next = p->next; free(p); printf("━━━━ 删除成功! ━━━━\n"); system("cls"); } else { printf("您输入的书目不存在,请确认后输入!\n"); } } } void ChangeBook(struct PPZBOOK * head) { struct PPZBOOK *pp; pp = head; if (head == NULL || head->next == NULL) { printf(" ━━━━ 图书库为空!━━━━\n"); } else { char tmp[100]; char ttt[100]; int g = 0; int flog = 0; printf("请输入你要修改的种类:φ(>ω<*) \n"); printf("1.修改书名\n2.修改作者\n3.修改状态\n友情提示:按其他数字键可以退出哦(*/ω\*)\n"); scanf("%d", &g); if (g == 1) { printf("请输入你要修改的书名:\n"); fflush(stdin); scanf("%s", &tmp); while (pp != NULL) { if (strcmp(pp->name, tmp) == 0) { printf("\n图书已找到!\n"); printf("\n"); printf("请输入你要它变为什么:\n"); scanf("%s", &ttt); strcpy(pp->name, ttt); flog = 1; } if (pp->next == NULL) { printf("正在为你修改!\n"); } pp = pp->next; } if (flog == 1) { printf("修改成功!\n"); } else { printf("修改失败!可能是你输入的信息我没找到\n"); } } else if (g == 2) { printf("请输入你要修改的作者:\n"); fflush(stdin); scanf("%s", &tmp); while (pp != NULL) { if (strcmp(pp->author, tmp) == 0) { printf("\n图书已找到!\n"); printf("\n"); printf("请输入你要它变为什么:\n"); scanf("%s", &ttt); strcpy(pp->author, ttt); flog = 1; } if (pp->next == NULL) { printf("正在为你修改!\n"); } pp = pp->next; } if (flog == 1) { printf("修改成功!\n"); } else { printf("修改失败!可能是你输入的信息我没找到\n"); } } else if (g == 3) { printf("请输入你要修改的状态:\n"); fflush(stdin); scanf("%s", &tmp); while (pp != NULL) { if (strcmp(pp->status, tmp) == 0) { printf("\n图书已找到!\n"); printf("\n"); printf("请输入你要它变为什么:\n"); scanf("%s", &ttt); strcpy(pp->status, ttt); flog = 1; } if (pp->next == NULL) { printf("正在为你修改!\n"); } pp = pp->next; } if (flog == 1) { printf("修改成功!\n"); } else { printf("修改失败!可能是你输入的信息我没找到\n"); } } else { printf("正在退出。。。。。。。。已退出\n"); } } } int Mima(char lwj[]) { if ((strcmp(lwjj, lwj) == 0) || (strcmp("123456", lwj) == 0)) { return 2; } else { return 1; } } void M(char q[]) { FILE *fp; fp = fopen("pwd.dat", "w+"); fprintf(fp, "%s\n", q); fclose(fp); strcpy(lwjj, q); } int User(char ppz[]) { if ((strcmp(ppzz, ppz) == 0) || (strcmp("admin", ppz) == 0)) { return 2; } else { return 1; } } void U(char p[]) { FILE *fp; fp = fopen("zhl是小可爱.txt", "w+"); fprintf(fp, "%s\n", p); fclose(fp); strcpy(ppzz, p); } void menu() { int choice = 0; struct PPZBOOK * head; head = NULL; while (1) { printf("●○○○○○○○○○○○○○○○○○○○○○○○○○○●\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("请选择:"); fflush(stdin); scanf("%d", &choice); switch (choice) { case 1: PrintBookList(head); break; case 2: if (head == NULL) { head = Creat(); } AddBook(head); break; case 3: ChangeBook(head); break; case 4: DeleteBook(head); break; case 5: SearchBook(head); break; case 6: printf("\n"); printf("**************** 感谢使用lwj的图书管理系统 ****************\n"); exit(1); default: printf(" ━━━━ (╬ ̄皿 ̄)=○#( ̄#)3 ̄) 你是傻的吗?<( ̄ ﹌  ̄)@m 这都会输入错误,快点请重新输入!━━━━\n"); break; } } } void jiemian() { char mima[100]; char user[100]; int count = 1; int s = 0, l = 0, j; printf("亲爱的用户,您是否已有账号密码了呢? ̄ω ̄=\n"); printf("如果有的话请按1,否则请按2\n"); while (1) { scanf("%d", &j); if (j == 1) { system("cls"); printf("●○○○○○○○○○○○○○○○●\n"); printf("○ ○\n"); printf("○ 请输入用户名和密码: ○\n"); printf("○ ○\n"); printf("●○○○○○○○○○○○○○○○●\n"); printf("你只有5次机会来输入正确的用户名和密码。(^_?)☆\n"); while (count < 6) { printf("第%d次\n", count); printf("请输入用户名:"); scanf("%s", user); l = User(user); printf("请输入密码:"); scanf("%s", &mima); s = Mima(mima); if (l == 2 && s == 2) { system("cls"); menu(); } else { printf("用户名或密码错误!b( ̄▽ ̄)d\n"); } count++; } break; } else { printf("(o?▽?)o 请输入你要注册的用户名:(ノ ̄▽ ̄)\n"); scanf("%s", user); U(user); printf("(o?▽?)o 请输入你要注册的密码:(ノ ̄▽ ̄)\n"); scanf("%s", mima); M(mima); printf("哇塞!注册成功了耶ヽ( ̄▽ ̄)?\n"); printf("请按1登录系统吧!(*/ω\*)\n"); } } } int main() { jiemian(); return 0; }

c语言链表删除节点问题

#include <stdio.h> #define NUll 0 #include <stdlib.h> struct stu { char name[6]; int xuehao; int grade; struct stu *next; }; typedef struct stu STU; main() { STU *p,*p_start,*p2,*p_print,*p_charu,*p_charu2; int i,xuehao; //输入 for (i=0;i<3;i++) { p=(STU *)malloc(sizeof(STU)); printf("请输入学生姓名:\n"); scanf("%s",&p->name); printf("请输入学生的学号:\n"); scanf("%d",&p->xuehao); printf("请输入学生的成绩:\n"); scanf("%d",&p->grade); if (i==0) p2=p_start=p; else { p2->next=p; p2=p; if (i==2) p->next=NULL; } } // printf("%d",p_start->next->next->next); // printf("%d",p_start->next->next->xuehao); //链表的插入 p_charu=p_start; printf("请输入要删除的学号\n"); scanf("%d",&xuehao); while (1) { p_charu2=p_charu->next; if (p_charu->next->xuehao==xuehao) { // if (p_charu->next->next==NULL) // p_charu->next=NULL; else p_charu->next=p_charu->next->next; free(p_charu2); break; } if (p_charu->xuehao==xuehao) { p_start=p_charu->next; free(p_charu); break; } p_charu=p->next; } //输出 p_print=p_start; /* for (i=0;i<2;i++) { printf("学生姓名为:%s\n",p_print->name); printf("学生的学号为:%d\n",p_print->xuehao); printf("学生的分数为:%d\n",p_print->grade); if (p_print->next!=NULL) p_print=p_print->next; } */ } 这是一个删除结点并输出的程序, 加注释的输出部分没有问题,关键应该在删除结点的循环那里,但是找不见错误啊, 错误为:当删除最后一个链表也就是3时程序发生错误,停止运行。 求解

数据结构C语言链表输入排序问题

题目: 持续输入 学号,姓名,地址 -1终止输入 _再按照学号从小到大顺序输出_ 个人感觉问题可能出在31行到38行 插入在链表最前面的时候会出现问题,其他情况没有问题 _测试 输入会错误的情况(插在开头):_ 3,sfdfs,sdfsfd 2,sdf,sdf,sfd -1 测试 输入会正确的情况: 3,sdf,sd,sfd 5,fsd,sdf 4,dsf,sdf -1 /////姓名和地址就乱打几个字符了。。。 下面是关于链的的数据的调试截图(输出_会错误的情况_,数据见上文 ) ![图片说明](https://img-ask.csdn.net/upload/201804/02/1522667445_697244.png) 直到输入 —1终止前 ,都是正确的(↑↑↑第一张调试图,排序也是对的) 但是终止后,就会无限输出开头的(↓↓↓最后输入的插到开头的那个数) 主链变成next永远指向自己的。 ![图片说明](https://img-ask.csdn.net/upload/201804/02/1522667643_272901.png) 虽然是用双链表写的,但是没什么关系。 个人感觉问题在出在指针返还值或者函数返还值上面,_步骤应该都是没有问题的_,调试了很多遍 ``` #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct node { char name[20]; char add[20]; int nu; struct node *pre; struct node *next; }Newnode; Newnode sort( node *q, Newnode *inser ) /* sort+insert 找到位置插入 */ { Newnode *temp = q; while ( 1 ) { if ( temp->next == NULL && temp->nu < inser->nu ) /* 插在尾的情况,插入数大于所有temp + 第一个数时插在后面 */ { temp->next = inser; inser->pre = temp; return(*q); } if ( temp->pre == NULL && temp->nu > inser->nu ) /* 第一个数时插在前面 */ { /* printf("okOK"); */ /* temp->pre=inser; */ inser->next = temp; return(*inser); } } inser->next = temp; inser->pre = temp->pre; temp->pre->next = inser; temp->pre = inser; return(*q); } Newnode add( Newnode *q ) //q就是主链的地址 { int count = 0; while ( 1 ) { Newnode *newnode; newnode = (Newnode * ) malloc( sizeof(Newnode) ); scanf( "%d,", &newnode->nu ); if ( newnode->nu == -1 ) { return(*q); } newnode->next = NULL; newnode->pre = NULL; scanf( "%[^,]%[^\n]", newnode->name, newnode->add ); if ( q->pre == NULL && q->next == NULL && count == 0 ) { q = newnode; count++; /* 第一个数的输入,只输入一次 */ continue; }else *q = sort( q, newnode ); /* 从第二个数开始就插入,这里的指针传递对吗。。。 */ } return(*q); } void printall( Newnode *q ) { Newnode *temp = q; /* temp当前指针 */ printf( "%d %s %s\n", q->nu, q->name, q->add ); temp = temp->next; /* printf("%d %s %s\n",temp->nu,temp->name,temp->add); */ while ( temp != NULL ) { printf( "%d %s %s\n", temp->nu, temp->name, temp->add ); temp = temp->next; } /* printf("%d %s %s\n",temp->nu,temp->name,temp->add); */ } /* ////////////////////// */ int main( void ) { char inpu; int inpu2; Newnode p; p.pre = NULL; p.next = NULL; p = add( &p ); printall( &p ); } ``` 第一个特别输入 其他 找到位置,然后插入,排序一个插入一个。 调试调试吧。 再次说一下,步骤应该是没有问题的。(除了插在开头的情况会出现错误)调试了很多数据了。感觉问题应该出在指针返还上面。

c语言链表节点删除问题求解

这是一个删除结点并输出的程序,总共有三个链表 错误为:当删除最后一个链表也就是3时程序发生错误,停止运行。 求大家帮忙解解决! ``` #include <stdio.h> #define NUll 0 #include <stdlib.h> struct stu { char name[6]; int xuehao; int grade; struct stu *next; }; typedef struct stu STU; main() { STU *p,*p_start,*p2,*p_print,*p_charu,*p_charu2; int i,xuehao; //输入 for (i=0;i<3;i++) { p=(STU *)malloc(sizeof(STU)); printf("请输入学生姓名:\n"); scanf("%s",&p->name); printf("请输入学生的学号:\n"); scanf("%d",&p->xuehao); printf("请输入学生的成绩:\n"); scanf("%d",&p->grade); if (i==0) p2=p_start=p; else { p2->next=p; p2=p; if (i==2) p->next=NULL; } } //链表的删除 p_charu=p_start; printf("请输入要删除的学号\n"); scanf("%d",&xuehao); while (1) { p_charu2=p_charu->next; if (p_charu->next->xuehao==xuehao) { p_charu->next=p_charu->next->next; free(p_charu2); break; } if (p_charu->xuehao==xuehao) { p_start=p_charu->next; free(p_charu); break; } p_charu=p->next; } } ```

链表内冒泡排序问题,c语言版

死循环了,不懂为什么,求哥哥姐姐们指教!我是新手,莫怪--- ``` struct student *sort(struct student *head) { if(!head) { goto END; } struct student *min,*p,*end; struct student temp; for(min = head;min != NULL;min = min->next) { end = min; } for(min = head;min != NULL;min = min->next) { for(p = head;p != end;p = p->next) { printf("123"); if(min->num > p->num) { temp = *min; *min = *p; *p = temp; printf("paixu\n"); } } } END: return head; } ``` ``` ```

c语言链表指针的指针问题

想问一下那个插入函数的类型是结构体指针的指针,输入参数是一个空指针的地址,有没有大神解释一下这个函数如何使用的呢? 还有就是如果直接用结构体指针函数,应该如何改能实现一样的功能 //学生结构体,包含数据:学号、姓名、性别、毕业学校、初试分数、复试分数 //按照学号递增插入信息 //按照学生姓名查询学号和成绩 #include <stdio.h> #include <stdlib.h> #include <string.h> // 数组结构体 typedef struct Node { int num; char name[20]; char sex[10]; char graduate_scholl[20]; int initial_score; int re_score; struct Node *next; }NODE , *PNODE; //NODE为结构体变量名,指向结构的指针 /* 相当于 typedef struct Node { ...... }NODE; //使用typedef关键字用一个单词NODE代替struct TreeNode,并定于指向该结构体类型的指针PNODE: NODE *PNODE; */ /** * 插入数字 * @param ** head 头指针地址 * @param int value 插入的数值 * @return void */ PNODE * insertValue(PNODE*head); /** * 打印数组 * @param * head 头指针 * @return void */ void printfValue(PNODE head); void check(PNODE head);//查询函数 int main(void) { PNODE head = NULL; int index; do { printf("是否录入学生数据?(0否/1是):"); scanf("%d", &index); if (index == 1) { insertValue(&head);//这里为何要这样取空指针 printf("\n\n"); printfValue(head); } } while (index == 1); check(head); return 0; } PNODE *insertValue(PNODE *head) //就是这个函数 看了好几天都没太懂 { PNODE previous = NULL; // 前一个指向地址 PNODE current = *head; // 当前指向地址 PNODE pNew = (PNODE )malloc(sizeof( NODE)); if (pNew == NULL) { printf("申请内存失败"); exit(1); } else { printf("请输入学生学号:"); scanf("%d",&pNew->num); printf("请输入学生姓名:"); scanf("%s",pNew->name); printf("请输入学生性别:"); scanf("%s",pNew->sex); printf("请输入学生毕业学校:"); scanf("%s",pNew->graduate_scholl); printf("请输入学生初试分数:"); scanf("%d",&pNew->initial_score); printf("请输入学生复试分数:"); scanf("%d",&pNew->re_score); } // currnt 不为 NULL => 数组有值 // current的值 < 待插入的值 => 转到下一个指向地址,并把当前地址存入previous。 while (current != NULL && current -> num < pNew -> num) { previous = current; //往后遍历,直到插入的值不大于当前的数 current = current -> next; } // 下一个地址内的值 > 待插入的值 => 待插入的值插入previous和current之间 pNew -> next = current; if (previous == NULL) { // previous == NULL 说明没有执行遍历循环 // 头插法 *head = pNew; } else { // previous(next) -> pNew(next) -> current previous -> next = pNew;//待插入的值插入previous之后 } return head; } void check(PNODE head) { char temp[10]; PNODE p=head; if(NULL == p) { printf("未录入信息,信息查询失败!"); } else { printf("请输入需要查询考生姓名:"); scanf("%s",temp) ; } while(p != NULL) { if(!strcmp(p->name,temp)) { printf("\n考生姓名为:%s的信息如下:\n",p->name); printf("该学生的学号为:%d\n",p->num); printf("该考生的初试成绩为:%d\n",p->initial_score); printf("该考生的复试成绩为:%d\n",p->re_score); break; } p = p->next; } } void printfValue(PNODE head) { PNODE current = head; while (current != NULL) { printf("学号:%d\n",current->num); printf("姓名:%s\n",current->name); printf("性别:%s\n",current->sex); printf("毕业学校:%s\n",current->graduate_scholl); printf("初试分数:%d\n",current->initial_score); printf("复试分数:%d\n",current->re_score); printf("\n"); current = current -> next; } printf("\n"); }

c语言链表 插入,dalao进来看看呗

typedef struct book { int number; char name[20]; int jaige; }stumes; typedef struct tagnode { stumes data; struct tagnode *next; }node; node *head=NULL; void charu() { int num,i; node *p,*q; p=head; printf("请输入你要插入位置: "); scanf("%d",&num); { printf("请输入你要插入的:\n"); q=(node *)malloc(sizeof(node)); scanf("%d %s %c %d %d",&q->data.number,q->data.jaige,q->data.name); while(p!=NULL) { if(p->data.number==q->data.number) { printf("该学号已经存在,无法插入!\n"); return ; } p=p->next; } p=head; for(i=0;i<num;i++) p=p->next; q->next=p->next; p->next=q; printf("插入成功!\n"); return ; } } 编译时通过了的,应该是逻辑上出了问题。

c语言链表尾插法思路分析

![图片](https://img-ask.csdn.net/upload/201703/05/1488682196_932629.jpg)![图片](https://img-ask.csdn.net/upload/201703/05/1488682440_11686.jpg)![图片](https://img-ask.csdn.net/upload/201703/05/1488682216_1882.jpg)

C语言链表与文件 从文件读数据到链表里

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> //定义全局变量 int isEmpty=0;//标志,判断链表是否为空 //!!!定义单链表结构体!!! typedef struct Node{ int NUM;//类型总数 char NAME[100];//各类型名称 int num; //各类型下的货物总数 struct Node*next; }Node; //函数声明 Node*create(int n,Node*L); Node*input(Node*L); Node*output(Node*L); Node*outnum(Node*L); Node*outname(Node*L); Node*current(Node*L); void search(Node*L); void print(Node*L); void searchnum(Node*L); void searchname(Node*L); void display(int n,Node*L); //========新增加的函数======== Node*append(Node*L); //主函数 void main() { //创建文件 FILE*fp; fp = fopen("storehouse.txt","w"); fwrite(); fclose(fp); int x; int n;//初次输入的大小 Node *L; if(!(L=(Node *)malloc(sizeof(Node)))) //分配空间 { printf("\n"); exit(1); } printf("欢迎使用我的仓库管理系统!\n"); while(1) { //主菜单开始 printf("==========================\n"); printf("1.显示货物类型列表\n"); printf("2.增加货物类型\n"); printf("3.删除货物类型\n"); printf("4.货物入库\n"); printf("5.货物出库\n"); printf("6.库存显示\n"); printf("7.退出\n"); printf("==========================\n"); //主菜单结束 printf("选择1-7:"); scanf("%d",&x); switch(x) { case 1:;break; case 2:printf("请输入最初的货物类型数量:\n"); scanf("%d",&n); create(n,L); break; case 3:;break; case 4:;break; case 5:;break; case 6:display(n,L);break; case 7:;break; default:printf("input error!\nplaese input1-7"); } } } =========================== 想要读入货物信息:货物名称 货物价格 所属类型?这个怎么搞! [图片说明](https://img-ask.csdn.net/upload/201805/29/1527585662_34177.png) //函数 //1.创建链表节点 Node*create(int n,Node*L) { Node*pTail=L; L->next=NULL; Node*p; //利用尾插建立单链表 int i; for(i=1;i<=n;i++) { p=(Node*)malloc(sizeof(Node)); if(p==NULL) { printf("申请内存空间失败!\n"); } printf("请输入第%d种类型编号:",i); scanf("%d",&p->NUM); printf("请输入第%d种类型名称:",i); scanf("%s",&p->NAME); printf("请输入第%d种类型库存:",i); scanf("%d",&p->num); putchar('\n'); pTail->next=p; pTail=p; } p->next=NULL; return L; } //货物显示函数 void display(int n,Node*L) { Node*p; p=(Node*)malloc(sizeof(Node)); p=L->next;; int i=0; for(i=0;i<n;i++) //{ //while(p!=NULL) { printf("第%d种类型名称:",p->NUM); printf("%s\n",p->NAME); printf("第%d种类型库存:",p->NUM); printf("%d\n",p->num); putchar('\n'); p=p->next; //} } }

C语言链表实现学生信息统计(只写了三个功能 输入 删除 输出)

第一个问题 输出的第一组数据的第一个学期不输出 ```#include<stdio.h> //#include #include<string.h> #include<stdlib.h> //#include using namespace std; #define MAX 200 //宏定义,修改数值可以改变程序所包含的最大文件个数 #define LEN sizeof(struct student) int n; int count=0; struct student { char xueqi[20]; //学期 int no; //学号 int clas; //班级 char name[50]; //姓名 int chi; //语文成绩 int math; //数学成绩 int eng; //英语成绩 int com; //计算机成绩 int PE; //体育成绩 int sum; int aver; struct student *next; }; struct student *head=NULL; void menu(); void menu2(); struct student * Insert (struct student *st); void add(); void to_menu(); void to_menu2(); struct student * Delete(int no); //void save_data(); //void read_data(); void view_data(); void delete_data(); //void edit_data(); //void query_data_no(); //void tongji1(); //void tongji2(); //void tongji3(); //void tongji4(); //void query_data_tongji(); int main() //主函数 { int fun; // read_data(); menu(); while(1) { system("color fc"); //编辑菜单及字体颜色 printf("请输入功能号[0-6]:",&fun); scanf("%d",&fun); switch(fun) { case 0: // 退 出 break; case 1: //按班级输出学生成绩 view_data(); break; case 2: //输入学生记录 add(); break; case 3: //删除学生记录 delete_data(); // break; // case 4: //编辑学生记录 // edit_data(); // break; // case 5: //查询学生记录 // query_data_no(); // break; // case 6: //统计系统 // query_data_tongji(); // break; } if(fun==0) break; to_menu(); } } void add() //添加学生信息 { int b,k; while(1) { struct student *st; st= (struct student *)malloc(sizeof(struct student)); k=count; printf("\n请输入学生信息:"); printf("\n学期"); printf("\n-------------------------------------------------------------\n"); getchar(); gets(st->xueqi); printf("\n学号"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->no); printf("\n班级"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->clas); printf("\n姓名"); printf("\n-------------------------------------------------------------\n"); getchar(); gets(st->name); printf("\n语文"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->chi); printf("\n数学"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->math); printf("\n英语"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->eng); printf("\n计算机"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->com); printf("\n体育"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->PE); st->sum=st->chi+st->math+st->eng+st->com+st->PE; st->aver=st->sum/5; count++; head=Insert(st); free(st); printf("\n\n继续添加学生信息[1-yes 0-no]:"); scanf("%d",&b); if(b==0) break; } // save_data(); } struct student * Insert (struct student *stud) { //原链表按num从小到大排列,参数stud是要插入结点 struct student *p0; // 待插入结点 struct student *p1; // p0插入p1之前、p2之后 struct student *p2; p1 = head; p0 = stud; if ( head == NULL ){//第一种情况,链表为空 head = p0;//p0成为链表中第一结点 p0->next = NULL; }else { while ((p0->no > p1->no) && (p1->next != NULL)) {//查找待插入位置 p2 = p1; p1 = p1->next; } if(p0->no <= p1->no) {//表示是从(p0->num > p1->num) 条件跳出循环 if (p1 == head) { //如果p1是表头结点,向第一结点之前插入 head = p0; p0->next = p1; } else{//向p1之前、p2之后插入 p2->next = p0; p0->next = p1; } } else { //表示从 (p1->next != NULL)条件跳出循环,p0插入表尾结点之后 p1->next = p0; p0->next = NULL; } } return (head); } void menu() //输出主菜单函数 { system("cls"); //清空屏幕函数 printf("\n"); printf("\t\t\t*******************************\n"); printf("\t\t\t* \n"); printf("\t\t\t 学生成绩管理系统 \n"); printf("\t\t\t \n"); printf("\t\t\t [0] 退出 \n"); printf("\t\t\t [1] 按学号输出学生成绩 \n"); printf("\t\t\t [2] 输入学生记录 \n"); printf("\t\t\t [3] 删除学生记录 \n"); printf("\t\t\t [4] 编辑学生记录 \n"); printf("\t\t\t [5] 查询学生记录 \n"); printf("\t\t\t [6] 统计学生记录 \n"); printf("\t\t\t \n"); printf("\t\t\t*******************************\n"); } void menu2() //输出统计系统菜单 { system("cls"); //清空屏幕函数 printf("\n"); printf("\t\t\t********************************\n"); printf("\t\t\t* \n"); printf("\t\t\t 统计系统 \n"); printf("\t\t\t \n"); printf("\t\t\t [0] 退出 \n"); printf("\t\t\t [1] 输出班级学生成绩 \n"); printf("\t\t\t [2] 班级各科成绩平均数 \n"); printf("\t\t\t [3] 班级各科成绩总分 \n"); printf("\t\t\t [4] 不及格名单 \n"); printf("\t\t\t \n"); printf("\t\t\t*******************************\n"); } void to_menu() //to_menu函数 { char c1,c2; printf("\n\n\n按回车键返回主菜单..."); scanf("%c%c",&c1,&c2); menu(); //调用menu函数 } void to_menu2() //to_menu函数 { char c1,c2; printf("\n\n\n按回车键返回上一菜单..."); scanf("%c%c",&c1,&c2); menu2(); //调用menu函数 } void view_data() { if(head==NULL) return; struct student *p=head; printf("学期\t学号\t\t班级\t\t姓名\t\t语文\t数学\t英语\t计算机\t体育\t总分\t平均分"); printf("\n-----------------------------------------------------------------------------------------------------------------\n"); do{printf("%s\t\t%d\t%-15d%s\t\t%-8d%-8d%-8d%-8d%-8d%-8d%-8d\n",p->xueqi,p->no,p->clas,p->name,p->chi,p->math,p->eng,p->com,p->PE,p->sum,p->aver); p=p -> next; }while(p!=NULL); } struct student * Delete(int no) {//删除值为num的结点 int sb=0; struct student *p1; // 指向要删除的结点 struct student *p2; //指向p1的前一个结点 if (head == NULL) { //空表 return (head); } p1 = head; while(no!= p1->no && p1->next != NULL) { //查找要删除的结点 p2 = p1; p1 = p1->next; } if (no == p1->no) { printf("\n\n删除(学号-%d)成功!",no); sb=1;// 找到了 if (p1 == head) //要删除的是头结点 head = p1->next; else// 要删除的不是头结点 p2->next = p1->next; // free(p1); //释放被删除结点所占的内存空间 } if(sb==0) printf("\n\n删除(学号-%d)成功!",no); return (head); //返回新的表头 } void delete_data() //删除学生记录 { int j; int no; j=count; view_data(); printf("\n请输入要删除学生的学号:"); scanf("%d",&no); head=Delete(no); // save_data(); } ``` ![图片说明](https://img-ask.csdn.net/upload/201906/04/1559647034_557.png)

c语言链表显示出错 求大佬帮忙

选项6出错 ![图片说明](https://img-ask.csdn.net/upload/201805/28/1527503476_559126.png) #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> //定义全局变量 int isEmpty=0;//标志,判断链表是否为空 //!!!定义单链表结构体!!! typedef struct Node{ int NUM;//类型总数 char NAME[100];//各类型名称 int num; //各类型下的货物总数 struct Node*next; }Node; //函数声明 Node*create(int n,Node*L); Node*input(Node*L); Node*output(Node*L); Node*outnum(Node*L); Node*outname(Node*L); Node*current(Node*L); void search(Node*L); void print(Node*L); void searchnum(Node*L); void searchname(Node*L); void display(int n,Node*L); //========新增加的函数======== Node*append(Node*L); //主函数 void main() { int x; int n;//初次输入的大小 Node *L; if(!(L=(Node *)malloc(sizeof(Node)))) //分配空间 { printf("\n"); exit(1); } printf("欢迎使用我的仓库管理系统!\n"); while(1) { //主菜单开始 printf("==========================\n"); printf("1.显示货物类型列表\n"); printf("2.增加货物类型\n"); printf("3.删除货物类型\n"); printf("4.货物入库\n"); printf("5.货物出库\n"); printf("6.库存显示\n"); printf("7.退出\n"); printf("==========================\n"); //主菜单结束 printf("选择1-7:"); scanf("%d",&x); switch(x) { case 1:;break; case 2:printf("请输入最初的货物类型数量:\n"); scanf("%d",&n); create(n,L); break; case 3:;break; case 4:;break; case 5:;break; case 6:display(n,L);break; case 7:;break; default:printf("input error!\nplaese input1-7"); } } } //函数 //1.创建链表节点 Node*create(int n,Node*L) { Node*pTail=L; L->next=NULL; Node*p; p=(Node*)malloc(sizeof(Node)); if(p==NULL) { printf("申请内存空间失败!\n"); } //利用尾插建立单链表 int i; for(i=1;i<=n;i++) { printf("请输入第%d种类型编号:",i); scanf("%d",&p->NUM); printf("请输入第%d种类型名称:",i); scanf("%s",&p->NAME); printf("请输入第%d种类型库存:",i); scanf("%d",&p->num); putchar('\n'); pTail->next=p; pTail=p; } p->next=NULL; return L; } //2.增加货物类型 /*Node*append(Node*L) { Node*ptail=L; L->next=NULL; Node*p; p=(Node*)malloc(sizeof(Node)); if(p==NULL) { printf("申请内存空间失败!\n"); } else { printf("请输入新增加的类型编号:\n"); scanf("%d",&p->NUM); printf("请输入第%d种类型名称:\n",i); scanf("%s",&p->NAME); printf("请输入第%d种类型库存:\n",i); scanf("%d",&p->num); while(p->NUM>) { } pTail->next=p; pTail=p; } p->next=NULL; } return L; } */ //货物显示函数 void display(int n,Node*L) { Node*p; p=(Node*)malloc(sizeof(Node)); p=L->next; int i=0; //for(i=0;i<n;i++) //{ while(p!=NULL) { printf("第%d种类型名称:",&p->NUM); printf("%s\n",&p->NAME); printf("第%d种类型库存:",&p->NUM); printf("%d\n",&p->num); p=p->next; //} } }

c语言链表的排序问题,求大神帮助。。

``` #include"hlinklist.h" void sort(linklist head) { linklist t,t2,min,z; t=head->next; printf("OK"); min=t; while(t!=NULL) { while(t->next!=NULL) { if((min->info)>(t->next->info)) { t2=t; min=t; } t=t->next; } t2->next=t2->next->next; min->next=head->next; head->next=min; } } int main() {linklist head; head=creatbyqueue(); print(head); sort(head); print(head); delist(head); return 0; } ``` 估计是sort函数出了问题,还请大神指点一二。。 估计是t2->next=t2->next->next这出了问题但不知如何解决。。 以下为头文件代码以备不时之需: ``` #include<stdio.h> #include<stdlib.h> typedef int datatype; typedef struct link_node{ datatype info; struct link_node *next; }node; typedef node *linklist; linklist creatbystack(){ linklist head,s; datatype x; s=(linklist)malloc(sizeof(node)); head=s; head->next=NULL; printf("请输入若干整数序列:\n"); scanf("%d",&x); while(x!=0) { s=(linklist)malloc(sizeof(node)); s->info=x; s->next=head->next; head->next=s; scanf("%d",&x); } return head; } linklist creatbyqueue() { linklist head,s,r; datatype x; s=(linklist)malloc(sizeof(node)); head=r=s; printf("请输入若干整数序列:\n"); scanf("%d",&x); while(x!=0) { s=(linklist)malloc(sizeof(node)); s->info=x; r->next=s; r=s; scanf("%d",&x); } r->next=NULL; return head; } void print(linklist head) { linklist p; int i=0; p=head->next; printf("List is:\n"); while(p) {printf("%5d",p->info); p=p->next; i++; if(i%10==0) printf("\n"); } printf("\n"); } void delist(linklist head) { linklist p=head; while(p) { head=p->next; free(p); p=head; } } ```

C语言中的链表赋值问题

我写了一个存储电影名字以及评级的链表,不理解其中以下三点 1.prev->next=current, 2.prev=current, 3.current=current->next 我目前的理解是:1.把current这个结构体指针变量的地址赋值给prev中的结构体指针变量next;2.把current这个结构体指针变量的地址赋值给结构体指针变量prev;3.令结构体指针变量current的值等于结构体指针变量next的值 不知道对吗? 以下是我的源代码: #include<stdio.h> #include<stdlib.h> //malloc();原型 #include<string.h> //strcpy();原型 #define SIZE 20 //最大字数 typedef struct film { char title[SIZE]; int rating; struct film * next; }Film; int main() { Film *head=NULL; Film *prev,*current; char title2[SIZE]; //写入 puts("Scan first title(0-20 charecter)"); while(gets(title2)!=EOF&&title2[0]!='\0') { current = (Film *)malloc(sizeof(Film)); //存第一个指针head if(head==NULL) { head=current; } //current's address 赋给next else prev->next=current; strcpy(current->title,title2); puts("Rating is...(0-10)"); scanf("%d",&current->rating); getchar(); //节点更换 puts("Enter next movie title"); prev=current; } //显示 if(head) { current=head; while(current!=NULL) { printf("the title is %s,the rating is %d\n",current->title,current->rating); current=current->next; //把下一个结构体指针的地址给current } } else puts("Not find any dota..."); //清内存 current=head; while(current) { free(current); current=current->next; } puts("OK!"); return 0; } 十分感谢

c语言存储链表数据问题

给你一个链表的头指针pHead,将一个结构体中的数据,比如: struct{ int num; char name[20]; char sex[10]; } 存储到磁盘中,然后下次启动程序之后又可以读取出来。 初次学习c语言,麻烦给出代码,谢谢

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

点沙成金:英特尔芯片制造全过程揭密

“亚马逊丛林里的蝴蝶扇动几下翅膀就可能引起两周后美国德州的一次飓风……” 这句人人皆知的话最初用来描述非线性系统中微小参数的变化所引起的系统极大变化。 而在更长的时间尺度内,我们所生活的这个世界就是这样一个异常复杂的非线性系统…… 水泥、穹顶、透视——关于时间与技艺的蝴蝶效应 公元前3000年,古埃及人将尼罗河中挖出的泥浆与纳特龙盐湖中的矿物盐混合,再掺入煅烧石灰石制成的石灰,由此得来了人...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你打算用Java 8一辈子都不打算升级到Java 14,真香

我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

一文带你入门Java Stream流,太强了

两个星期以前,就有读者强烈要求我写一篇 Java Stream 流的文章,我说市面上不是已经有很多了吗,结果你猜他怎么说:“就想看你写的啊!”你看你看,多么苍白的喜欢啊。那就“勉为其难”写一篇吧,嘻嘻。 单从“Stream”这个单词上来看,它似乎和 java.io 包下的 InputStream 和 OutputStream 有些关系。实际上呢,没毛关系。Java 8 新增的 Stream 是为...

立即提问
相关内容推荐