c语言链表排序问题

已解决问题
C语言链表问题,作业编程。编好出现问题。高手看下。
课程设计题目:学生成绩管理2(由
  课程设计内容:用C语言编写程序完成以下任务:
  学生基本信息包括学号,姓名,计算机成绩,请编程序,实现如下的功能:
  (1)创建链表存放学生信息,并将学生信息保存到students.txt文件中。
  (2)显示学生信息。
  (3)修改指定学号的学生成绩并可存盘。
  课程设计要求:
  1.贯彻结构化程序设计思想。
  2.用户界面友好,功能明确,操作方便;可以加以其它功能或修饰。
  3.用户界面中的菜单至少应包括&创建链表&、&显示学生信息&、&学生成绩修改&、 &退出&4项。
  4.代码应适当缩进,并给出必要的注释,以增强程序的可读性。
浏览次数:614
用手机阿里扫一扫
最满意答案
  #include &stdlib.h&
  #include &stdio.h&
  #include &string.h&
  #include &malloc.h&
  typedef struct linknode
  char name[21];
  struct linknode *
  } linknode, *
  void input(linklist *h);
  void cleanup(linklist h);
  void modify(linklist h);
  void print(linklist h);
  /* 添加学生记录 */
  void input(linklist *h)
  linklist p,
  p = q = NULL;
  printf(&\n\n请输入学生信息(学号 姓名 成绩 ,学号为0结束):\n&);
  while (1)
  scanf(&%ld&, &num);
  if (num == 0)
  p = (linklist)malloc(sizeof(linknode));
  if (p == NULL)
  cleanup(*h);
  exit(-1);
  p-&number =
  p-&next = NULL;
  scanf(&%s %d&, p-&name, &p-&score);
  getchar();
  if (*h == NULL)
  *h = q =
  q-&next =
  getchar();
  /* 释放资源 */
  void cleanup(linklist h)
  linklist p =
  while (p != NULL)
  h = p-&
  free(p);
  /* 修改学生记录 */
  void modify(linklist h)
  if (h == NULL)
  char choice, name[21];
  int found = 0;
  linklist p =
  printf(&\n\n请选择查询方式:1) 学号 2) 姓名\n&);
  choice = getchar();
  getchar();
  if (choice == '1')
  scanf(&%d&, &num);
  scanf(&%20[^\n]&, name);
  getchar();
  while (p)
  if (choice == '1' && p-&number == num)
  found = 1;
  else if (!strcmp(p-&name, name))
  found = 1;
  if (found)
  printf(&请输入新学生信息(学号 姓名 成绩): &);
  scanf(&%ld %s %d&, &p-&number, p-&name, &p-&score);
  getchar();
  p = p-&
  if (found)
  printf(&成功更新学生信息\n&);
  printf(&找不到学生信息\n&);
  /* 输出所有学生记录 */
  void print(linklist h)
  linklist p =
  printf(&\n\n学号\t姓名\t成绩\n&);
  while (p)
  printf(&%ld\t%s\t%d\n&, p-&number, p-&name, p-&score);
  p = p-&
  int main(void)
  linklist head,
  head = cursor = NULL;
  printf(&***欢迎使用简单学生管理系统***\n&);
  while (1)
  printf(&\n功能选择:\n&);
  printf(&1) 添加记录 2) 显示记录 3) 修改记录 4)退出程序\n&);
  choice = getchar();
  getchar();
  switch (choice)
  case '1':
  input(&head);
  case '2':
  print(head);
  case '3':
  modify(head);
  case '4':
  FILE *fp = fopen(&students.txt&, &w&);
  if (fp == NULL)
  printf(&无法打开文件,保存数据出错。。&);
  exit(-1);
  cursor =
  /* 保存学生记录 */
  while (cursor != NULL)
  fprintf(fp, &%ld %s %d\n&, cursor-&number, cursor-&name, cursor-&score);
  cursor = cursor-&
  fclose(fp);
  cleanup(head);
  return 0;
答案创立者
以企业身份回答&
正在进行的活动
生意经不允许发广告,违者直接删除
复制问题或回答,一经发现,拉黑7天
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题
扫一扫用手机阿里看生意经
问题排行榜
当前问题的答案已经被保护,只有知县(三级)以上的用户可以编辑!写下您的建议,管理员会及时与您联络!
server is ok豆丁微信公众号
君,已阅读到文档的结尾了呢~~
C语言课程设计链表操作
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
C语言课程设计链表操作
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
稍有积蓄, 积分 230, 距离下一级还需 270 积分
论坛徽章:0
#include &stdio.h&
#include &stdlib.h&
#include &string.h&
struct student{
& &&&char *
typedef struct student STU;
struct Node{
& & struct Node *
typedef struct Node NODE;
//链表的初始化
NODE *init_Node(NODE *L)
& & L=(NODE *)malloc(sizeof(NODE));
& & if(!L) printf(& L is NULL\n&);
& && &memset(&(L-&Data),0,sizeof(STU));
& && &printf(&name:%s,score:%lf\n&,L-&Data.name,L-&Data.sore);
& && &L-&next=NULL;
& && &printf(&0x%x\n&,L-&next);
& &return L;
//链表的添加
int&&Listinserth(NODE *L,STU data)
& & & & NODE *H;
& & & & H=L;
& & & & while(H)
& & & && &printf(&调试H-&Data.name=%s\n,调试:H-&Data.sore=%lf\n&,H-&Data.name,H-&Data.sore);
& & & && &H=H-&
& & & & if(!H)
& && && && & H=(NODE *)malloc(sizeof(NODE));
& & & & & & & & & &&&H-&Data=
& & & & & & & & & &&&H-&next=NULL;
& & & & & & & & & &&&printf(&No to successful\n&);
& && & & &&&}
&&& & & &&&else
& & & & & & & & {
& & & & & & & &&&H-&Data=
& & & & & & & &&&H-&next=NULL;
& & & & & & & &&&printf(& exist to exist!&);
& & & & & & & & }
& & & &&&printf(&调试H-&Data.name=%s\n,调试:H-&Data.sore=%lf\n&,H-&Data.name,H-&Data.sore);
//& & & & NODE *S;
//& & & & S=H;
//& & & & while(H)
//& & & & {
//& & & & printf(&H-&Data.name:%s,H-&Data.sore:%lf\n&,H-&Data.name,H-&Data.sore);
//& & & & H=H-&
//& & & & }
//& & & & if(!H)
// & & & & & & & & printf(&H is null\n&);
//& & & & H=S;
& & & & return 0;
//输出链表
void DisplayList(NODE *p)
& & & & NODE *q;
& & & & q=p;
& & & & printf(&我就不相信没有东西输出:\n&);
& & & & if(q==NULL)
& & & & & & & & printf(&P is NULL \n&);
& & & & else
& && && && && & while(q)
& && && && && &{
& && &&&& & & && && & printf(&name:%s, sore:%lf\n&,q-&Data.name,q-&Data.sore);
& && &&&& & & && && & q=q-&
& && && && && &}
int main(int argc,char *argv[])
& &&&NODE *p;
& &&&p=init_Node(p);
& &&&printf(&P_init:0x%x\n&,p);
& &&&printf(&name:%s,score:%lf\n&,p-&Data.name,p-&Data.sore);
& &&&STU data1;
& &&&data1.name=&duwei&;
& &&&//strcpy(data1.name,&duwei&);
& &&&data1.sore=145.50;
& &&&printf(&p1:0x%x\n&,p);
& &&&Listinserth(p,data1);
& &&&printf(&p2:0x%x\n&,p);
& &&&DisplayList(p);
& &&&STU data2;
& &&&data2.name=&hello world&;
& &&&data2.sore=146.85;
& &&&Listinserth(p,data2);
& &&&printf(&p address:0x%x\n&,p);
& &&&DisplayList(p);
& &&&printf(&add successfully\n&);
& &&&return 0;
这个是我代码:我实现的是在链表尾部插入一个结点,并将整个链表输出:
有个问题在插入函数,我知道是什么问题,希望高手帮忙解决下,最好能提供解决方法
稍有积蓄, 积分 230, 距离下一级还需 270 积分
论坛徽章:0
来个人帮帮忙行不
稍有积蓄, 积分 230, 距离下一级还需 270 积分
论坛徽章:0
有人吗,我纠结了好几天了,都不知道怎么修改,谁帮我看看啊
丰衣足食, 积分 595, 距离下一级还需 405 积分
论坛徽章:0
添加链表元素中,现在的做法是直接把一个 STU 实例复制给另外一个: H-&Data=data ,这个赋值会起作用么?
既然 NODE 中已经包含了一个 STU 的实例,那么在链表的插入中,应该对这个实例中的每一个成员变量分别赋值。
if(!H)
& & {
& && &&&H=(NODE *)malloc(sizeof(NODE));
& && &&&H-&Data.name=data.
& && &&&H-&Data.sore = data.
& && &&&printf(&Name: %s, score: %lf\n&, H-&Data.name, H-&Data.sore);
& && &&&H-&next=NULL;
& & }
复制代码其实,在 NODE 中直接嵌入一个 STU 的指针,然后向链表中插入数据的时候也传指针会更好一些。起码少好几次 malloc 。
家境小康, 积分 1421, 距离下一级还需 579 积分
论坛徽章:0
这是由于你在插入节点的时候没有将上一个节点的 next 指针指向节点。
大富大贵, 积分 15884, 距离下一级还需 4116 积分
论坛徽章:0
插入算法基本模式
Node *pNew = new N
memset(pNew, 0, sizeof(Node));
Node *p = pH
while(p-&pNext != NULL)
& & p = p-&pN
p-&pNext = pN
pNew-&pNext = NULL;
稍有积蓄, 积分 230, 距离下一级还需 270 积分
论坛徽章:0
5楼的正解,谢谢!!!
谢谢大家!!
富足长乐, 积分 5817, 距离下一级还需 2183 积分
论坛徽章:0
慢慢跟踪,总会发现问题的
稍有积蓄, 积分 230, 距离下一级还需 270 积分
论坛徽章:0
谢谢5楼和6楼,非常感谢,OK了,哎,我现在多是下班自己学这个,工作和这个不想干,所以没什么时间,你们帮我节省了大量时间,真的非常感谢,有机会请你们吃饭,哈哈
白手起家, 积分 59, 距离下一级还需 141 积分
论坛徽章:0
本帖最后由 fifa2002nb 于
21:29 编辑
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处C语言 - 链表的基本操作
1,为什么要用到链表
数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性。但数组也同样存在一些弊病。如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要3 0个大小的数组,有时需要5 0个数组的大小,难于统一。我们只能够根据可能的最大需求来定义数组,常常会造成一定存储空间的浪费。
我们希望构造动态的数组,随时可以调整数组的大小,以满足不同问题的需要。链表就是我们需要的动态数组。它是在程序的执行过程中根据需要有数据存储就向要求申请存储空间,决不构成对存储区的浪费。
链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表、循环链表、双向链表,下面将逐一介绍。
2,单向链表
单链表有一个头节点head,指向链表在内存的首地址。链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址(事实上,此单链表是用于存放整型数据的动态数组)。链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为NULL。
上图还给出这样一层含义,链表中的各节点在内存的存储地址不是连续的,其各节点的地址是在需要时向系统申请分配的,系统根据内存的当前情况,既可以连续分配地址,也可以跳跃式分配地址。
3,单向链表程序的实现
(1),链表节点的数据结构定义
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
struct node
struct node *p;
在链表节点的定义中,除一个整型的成员外,成员p是指向与节点类型完全相同的指针。
在链表节点的数据结构中,非常特殊的一点就是结构体内的指针域的数据类型使用了未定义成功的数据类型。这是在C中唯一规定可以先使用后定义的数据结构。
(2),链表的创建、输出步骤
单链表的创建过程有以下几步:
1 ) 定义链表的数据结构;
2 ) 创建一个空表;
3 ) 利用malloc ( )函数向系统申请分配一个节点;
4 ) 将新节点的指针成员赋值为空。若是空表,将新节点连接到表头;若是非空表,将新
节点接到表尾;
5 ) 判断一下是否有后续节点要接入链表,若有转到3 ),否则结束;
单链表的输出过程有以下几步
1) 找到表头;
2) 若是非空表,输出节点的值成员,是空表则退出;
3 ) 跟踪链表的增长,即找到下一个节点的地址;
4) 转到2 ).
(3),程序代码例子:
创建一个存放正整数单链表,输入0或小于0的数,结束创建链表,并打印出链表中的值,程序如下:
Created by 于磊 on 16/8/19.
Copyright ? 2016年 于磊. All rights reserved.
//# include
typedef struct Node
struct Node * pN
} * PNODE, NODE;
PNODE establish_list (void);
void traverse_list (PNODE pHead);
bool is_empty(PNODE pHead);
int length_list(PNODE pHead);
void sort_list(PNODE pHead);
void insert_list(PNODE pHead, int pos, int val);
int delete_list(PNODE pHead, int pos, int val);
void freeer(PNODE pHead);
int main(void)
int len, i, j,
pHead = establish_list();
traverse_list(pHead);
if(is_empty(pHead))
printf(&链表为空\n&);
printf(&链表不空\n&);
len = length_list(pHead);
printf(&链表的长度为: %d\n&, len);
sort_list(pHead);
traverse_list(pHead);
printf(&请输入您要在第几个节点插入\n&);
scanf(&%d&, &i);
printf(&请输入您要在第%d个节点插入的值\n&, i);
scanf(&%d&, &j);
insert_list(pHead, i, j);
traverse_list(pHead);
printf(&请输入您要第几个删除的节点\n&);
scanf(&%d&, &i);
val = delete_list(pHead, i, val);
printf(&您删除的节点值为: %d\n&, val);
traverse_list(pHead);
freeer(pHead);
PNODE establish_list(void)//初始化链表,返回头结点地址
pHead = (PNODE)malloc(sizeof(NODE));
if(NULL == pHead)
printf(&分配失败&);
Tem-&pNext = NULL;
printf(&请输入您要定义节点的长度: &);
scanf(&%d&, &len);
for (int i=0;idata =//首先把本次创建的新节点的值付给新节点的数据域
Tem-&pNext = pN//然后使用临时的节点变量的指针域保存了新节点的地址,也就是指向了新节点
pNew-&pNext = NULL;//如何再不循环,新节点成为最后一个节点
Tem = pN//把本次分配的新节点完全的赋给Tem,Tem就成为了这次新节点的影子,那么下次分配新节点时可以使用上个新节点的数据
void traverse_list(PNODE pHead)
PNODE p = pH//使用P是为了不改写头结点里保存的地址
p = pHead-&pN//使P指向首节点
while(p != NULL)//P本来就是头结点的指针域,也就是首节点的地址,既然是地址就可以直接判断p是否等于NULL
printf(&%d &, p-&data);
p = p-&pN//使P每循环一次就变成P的下一个节点
bool is_empty(PNODE pHead)
if(NULL == pHead-&pNext)
int length_list(PNODE pHead)
PNODE p = pHead-&pN
int len = 0;
while(p != NULL)
void sort_list(PNODE pHead)
int i, j, t,
len = length_list(pHead);
for(i=0,p=pHead-&pNipNext)//逗号后只是为了找到下一个节点,因为不是数组,所以不能使用下标来++
for(j=0,q=pHead-&pNjpNext)
if(q-&data & p-&data)//这里的大小与号可以决定是升序还是降序,如果是大于号就是升序,反之小于号就是降序
q-&data = p-&
void insert_list(PNODE pHead, int pos, int val)
PNODE q = pH
PNODE p = pH
if(pos & 0 && pos &= length_list(pHead))
for(i=0;ipN//q就是要插入的连接点
for(i=1;ipN//p就是要插入连接点的前一个节点
PNODE pNew = (PNODE)malloc(sizeof(NODE));
p-&pNext = pN
pNew-&data =
pNew-&pNext =
else if(pos & length_list(pHead))//追加
PN = (PNODE)malloc(sizeof(NODE));
if(PN == NULL)
printf(&分配失败&);
while(t-&pNext != NULL)
t = t-&pN//使T-&pNext成为尾结点
PN-&data =//给新节点赋予有效数据
t-&pNext = PN;//使尾结点的指针域指向了新的结点
PN-&pNext = NULL;//新节点成为尾结点
printf(&error\n&);
int delete_list(PNODE pHead, int pos, int val)
if(pos & 0 && pos &= length_list(pHead))//保证删除的是节点的有效数
for(i=0;ipN
for(j=1;jpN
q-&pNext = p-&pN
printf(&error&);
void freeer(PNODE pHead)
PNODE pT = pH
while(NULL != pHead-&pNext)
pT = pT-&pNc语言链表问题c_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
c语言链表问题c
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩16页未读,
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 c语言链表详解 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信