C语言 链表各种有关问题
C语言 链表各种问题
结构:
struct student //创建数据结构
{
char num[10];/*学号*/
char name[20];//姓名
int cgrade;//C语言分数
int mgrade;//数学分数
int egrade;//英语分数
int totle;//总分
int ave;//平均分
};
typedef struct node//链表
{
struct student data;
struct node *next;
} Node,*Link;
问题1
Node *s;
Char lastnum[10]="-1";
lastnum=s->data.num;
问题: 这个哪里不对啊;
问题2
怎么对这个结构的链表排序输出
void Cpaixu(Link l)
{
Link p,q,small,a;
Link temp;
a=l->next;
for(q=a->next;a->next!=NULL;q=a->next)
{
small = q;
q=a->next
for(q=p->next;q;q=q->next)
{
if(q->data.cgrade<small->data.cgrade)
{
small=q;
}
}
if(small->data.cgrade!=p->data.cgrade)
{
temp=p;
p=small;
small=temp;
}
}
}
貌似一点都不对.....
------解决方案--------------------
Char lastnum[10]="-1";
lastnum=s->data.num;
-----------------------
1)data是什么? 什么变量?怎么声明定义的?
2)对数组赋值是这样的? 同学c语言基本常识要好好看看。
for(q=p->next;q;q=q->next) 很奇怪 p->next访问 你不会出core么? p声明定义了一次后都没初始化。
------解决方案--------------------
Char lastnum[] ===> 应该是小写的“char"吧。
lastnum=s->data.num; ==>字符串的赋值用strcpy(lastnum, s->data.num);
后面的指针赋值出错的话,就单步调试吧。太乱了。
------解决方案--------------------
结构:
struct student //创建数据结构
{
char num[10];/*学号*/
char name[20];//姓名
int cgrade;//C语言分数
int mgrade;//数学分数
int egrade;//英语分数
int totle;//总分
int ave;//平均分
};
typedef struct node//链表
{
struct student data;
struct node *next;
} Node,*Link;
问题1
Node *s;
Char lastnum[10]="-1";
lastnum=s->data.num;
问题: 这个哪里不对啊;
问题2
怎么对这个结构的链表排序输出
void Cpaixu(Link l)
{
Link p,q,small,a;
Link temp;
a=l->next;
for(q=a->next;a->next!=NULL;q=a->next)
{
small = q;
q=a->next
for(q=p->next;q;q=q->next)
{
if(q->data.cgrade<small->data.cgrade)
{
small=q;
}
}
if(small->data.cgrade!=p->data.cgrade)
{
temp=p;
p=small;
small=temp;
}
}
}
貌似一点都不对.....
------解决方案--------------------
Char lastnum[10]="-1";
lastnum=s->data.num;
-----------------------
1)data是什么? 什么变量?怎么声明定义的?
2)对数组赋值是这样的? 同学c语言基本常识要好好看看。
for(q=p->next;q;q=q->next) 很奇怪 p->next访问 你不会出core么? p声明定义了一次后都没初始化。
------解决方案--------------------
Char lastnum[] ===> 应该是小写的“char"吧。
lastnum=s->data.num; ==>字符串的赋值用strcpy(lastnum, s->data.num);
后面的指针赋值出错的话,就单步调试吧。太乱了。
------解决方案--------------------
- C/C++ code
#include<stdio.h> #include<stdlib.h> /*使用到其中的malloc和exit函数*/ #define times 4 /*用于循环次数的控制*/ static int N = 4; /*静态全局变量,用于控制单链表长度*/ typedef struct _person { char name[12]; int age; struct _person* next; } stud; stud* Create(int num) /*创建单链表的函数,num为单链表的长度*/ { int i; stud* h, *p, *q; /* h为头指针,指向单链表的第一个节点*/ h = (stud*)malloc(sizeof(stud)); if (h != NULL) { p = h; for (i = 0; i < num; i++) { q = (stud*)malloc(sizeof(stud)); /* q为指向新建节点的指针*/ if (q != NULL) { printf("依次输入第%d个人的姓名和年龄:\n", i + 1); scanf("%s%d", q->name, &q->age); q->next = NULL; /*创建新节点完毕*/ p->next = q; p = q; } } } printf("\n"); return(h); } stud* Delete(stud* person, int post) /*删除单链表指定位置节点的函数*/ { int i; stud* cur, *pre; cur = person; if (0 == post) { /*如果输入的值为0,则不删除任何节点*/ printf("\n注意:您决定不删除任何节点!!!\n\n"); return(person); } else if (post > N || post < 0) { /*如果输入的值大于单链表长度或者小于0,程序结束*/ printf("输入有误,程序终止。\n"); exit(1); } else { if (1 == post) { /*在单链表头部删除的情况*/ cur = cur->next; person->next = cur->next; free(cur); } else { /*在其它位置删除的情况*/ for (i = 2; i < post + 1; i++) { /*使pre成为要插入位置的上一位置的节点*/ cur = cur->next; pre = cur; } cur = cur->next; pre->next = cur->next; free(cur); } return(person); } } stud* Insert(stud* person, int post) /*在单链表指定位置插入新的节点的函数*/ { int i; stud* cur, *pre, *node; if (post > N + 1 || post < 1) { /*如果输入的值大于单链表长度加1或者小于1,程序结束*/ printf("输入错误,程序终止。\n"); exit(1); } if (person != NULL) { cur = person; node = (stud*)malloc(sizeof(stud)); if (node != NULL) { printf("请输入新人的姓名和年龄:\n"); scanf("%s%d", node->name, &node->age); /*为新的节点输入数据内容*/ if (1 == post) { node->next = person->next; person->next = node; } else { for (i = 2; i < post + 2; i++) { pre = cur; cur = cur->next; } node->next = pre->next; pre->next = node; } } } printf("\n"); return(person); } void Print(stud* person) { int post = 1; stud* cur; cur = person->next; printf("当前的节点信息如下所示:\n"); while (cur != NULL) { printf("第%d个人的姓名是:%s,年龄为:%d\n", post, cur->name, cur->age); cur = cur->next; post++; } N = --post; printf("当前单链表的长度是:%d\n\n", N); } int main() { int number, post, i; stud* head; head = Create(N); Print(head); for (i = 0; i < times; i++) { printf("请输入要删除的节点的位置:\n"); scanf("%d", &number); Delete(head, number); Print(head); printf("请输入要插入节点的位置(此位置是指预期插入成功后新节点在单链表中的位置):\n"); scanf("%d", &post); Insert(head, post); Print(head); printf("\n注意:剩余输入轮数为:%d !!!!!\n\n", (times - (i + 1))); } return 0; }