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);

后面的指针赋值出错的话,就单步调试吧。太乱了。
------解决方案--------------------
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;
}