user-0 提问: 建立链表结点，删除包含输入年龄的结点

回复:
user: user-1
content: 引用 楼主 <span style="color:#4788C7">coningg</span>的回复:[quote=引用 楼主 coningg的回复:]  #include <stdio.h> #include <stdlib.h> struct Student{     int id;     char name[20];     char sex;     int age;     Student *next; }; void input(Student *stu, int n); void print(Student *stu); Student *del(Student *stu, int n); int main() {     Student s[3];     input(s, 3);     int m;     printf("请输入一个年龄:\n");     scanf("%d", &m);     print(del(s, m));     system("pause");     return 0; } void input(Student *stu, int n) {     Student *p;     int i;     for (p=stu, i=0; p<stu+n; p++, i++){         printf("请输入第%d名学生的学号,姓名,性别,年龄:\n", i+1);         scanf("%d,%s,%c,%d",&p->id,p->name,&p->sex,&p->age);         i==n-1 ? stu[i].next=NULL : stu[i].next=&stu[i+1];     } } void print(Student *stu) {     Student *p;     for (p=stu; p!=NULL; p=p->next)         printf("%d,%s,%c,%d\n",p->id,p->name,p->sex,p->age); } Student *del(Student *stu, int n) {     Student *p, *head;     int i;     for (p=stu, head=p, i=1; p!=NULL; p=p->next)         if (p->age==n){             if (head==p)                 head=p->next;             else if (p->next==NULL)                 (p-i)->next=NULL;             else{                 (p-1)->next=p+1;                 i++;             }         }     return head; }  代码哪里错了[/quote]<br />为什么我的代码遇到相邻两个同学的年龄相同时就只删除前一个的情况呢

user: user-2
content: ！ （1）虽然代码用了尾指针指向下一个所谓的结点，然而实际上是预先定义好了一个结构体数组，数组的成员本来就是线性连续排列的，那么这只是一个表面链表而已。 （2）结构体类型的名称没有使用typedef起别名，直接使用Student竟然能够通过编译，还能执行，有点儿匪夷所思。反正俺使用的gcc或者clang都是直接报错了的。 （3）输入数据的语句有问题，          printf("请输入第%d名学生的学号,姓名,性别,年龄:\n", i+1);         scanf("%d,%s,%c,%d",&p->id,p->name,&p->sex,&p->age);  虽然看起来用逗号分隔开了各个不同的输入数据，但是实际上 %s 把输入的第1个逗号后面的数据都吸收到字符串name里了。而敲下回车之后，scanf函数检测到输入缓冲区的这个回车符与格式化字符串中的下一个字符（逗号,）不一样，判断为输入异常，于是结束scanf，而后面的变量p->sex和p->age就没有获得数据，那么它们俩的值就是未初始化的值，是随机值。 所以，后面的 del 函数是找不到 p->age 的值为 19 的，除非正好有一个 p->age 的随机值是 19 。这么巧的话，可以去买彩票了！ （4）解决办法，把输入语句改为一下这样：  printf("请输入第%d名学生的学号 年龄 姓名 性别:\n", i + 1); scanf("%d %s %c %d", &p->id, p->name, &p->sex, &p->age);  也就是，用空格来分隔各个部分，在scanf的格式化字符串中显式地使用空格。 （5）Linux平台测试运行截图：  如有帮助，欢迎及时结帖、给分！ ：-） ～

user: user-3
content: 你这个是个链表和数组的结合体，单项链表不存在后一个结点可以(p-1)得到前一个节点的情况的，需要临时指针记前一个节点。 赋值放入for不是好习惯 给你发一个单链表的节点删除代码你参考一下:     void EraseNode(Node* pos) //删除指定节点     {  	Lock();//锁定单链表          if (pos == _head)         {             _head = _head->_next;              delete pos; 	    pos=NULL;         }         else         {             Node* cur(_head);             while (cur->_next != pos)             {                 cur = cur->_next;             } 	   if(pos->_next==NULL) 	   { 		_tail = cur; 	  }              cur->_next = pos->_next;             delete pos;             pos = NULL;         } 		ULock();//解除锁定      }

user: user-4
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-5
content: scanf是通过空格或换行符来区分相邻的两个输入的。 void input(Student *stu, int n) {     Student *p;     int i;     for (p=stu, i=0; p<stu+n; p++, i++){         printf("请输入第%d名学生的学号,姓名,性别,年龄:\n", i+1);         scanf("%d %s %c %d",&p->id,p->name,&p->sex,&p->age);         printf("id:%d,name:%s,sex:%c,age:%d\n",p->id,p->name,p->sex,p->age);         i==n-1 ? stu[i].next=NULL : stu[i].next=&stu[i+1];     } }  供参考～  链表操作建议还是使用堆上的空间，使用数组+next指针形式，反而在简单处理问题上复杂化了。

user: user-0
content: 引用 楼主 coningg的回复:  #include <stdio.h> #include <stdlib.h> struct Student{     int id;     char name[20];     char sex;     int age;     Student *next; }; void input(Student *stu, int n); void print(Student *stu); Student *del(Student *stu, int n); int main() {     Student s[3];     input(s, 3);     int m;     printf("请输入一个年龄:\n");     scanf("%d", &m);     print(del(s, m));     system("pause");     return 0; } void input(Student *stu, int n) {     Student *p;     int i;     for (p=stu, i=0; p<stu+n; p++, i++){         printf("请输入第%d名学生的学号,姓名,性别,年龄:\n", i+1);         scanf("%d,%s,%c,%d",&p->id,p->name,&p->sex,&p->age);         i==n-1 ? stu[i].next=NULL : stu[i].next=&stu[i+1];     } } void print(Student *stu) {     Student *p;     for (p=stu; p!=NULL; p=p->next)         printf("%d,%s,%c,%d\n",p->id,p->name,p->sex,p->age); } Student *del(Student *stu, int n) {     Student *p, *head;     int i;     for (p=stu, head=p, i=1; p!=NULL; p=p->next)         if (p->age==n){             if (head==p)                 head=p->next;             else if (p->next==NULL)                 (p-i)->next=NULL;             else{                 (p-1)->next=p+1;                 i++;             }         }     return head; }  代码哪里错了