Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108863
  • 博文数量: 45
  • 博客积分: 1810
  • 博客等级: 上尉
  • 技术积分: 345
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-03 21:57
文章分类
文章存档

2010年(26)

2009年(19)

我的朋友

分类: C/C++

2009-12-06 16:41:55

最进在学习链表,中间遇到一些问题,现在把他们写在这里,以防自己再犯类的的错误,让自己更好的掌握链表(可能有些东西读了不是很懂,这是因为有些错误我是特定的环境下犯的,而这个环境我没有很好的描述出来,所以有些结束写的有点让人摸不到头脑,这是我个人的原因,望见谅)

在使用链表时,一件肯定要做的事情就是创建链表,我在树上看到的一种创建方法如下:

#include
#include
#include

#define PT "学号: %ld 姓名:%-10s 成绩:%6.1f\n",p->num ,p->name,p->score
#define  N sizeof(struct stud)

struct stud{
    long num;
    char name[11];
    float score ;
    struct stud *next ;
};

void print(struct stud *p)
{

    p=p->next;
    while (p!=NULL){
        printf(PT);
        p=p->next;
    }
}
struct stud *creat (void){
    struct stud *p1,*p2,*head ;
    head=p2=(struct stud*)malloc(N);
    printf("请输入学号: 姓名:  成绩(学号输入0结束)\n");
    p1 = (struct stud*)malloc(N);
    scanf("%ld%s%f",&p1->num,p1->name,&p1->score);

    while(p1->num != 0){
        p2->next = p1;
        p2=p1;
        p1=(struct stud *)malloc(N);
        scanf("%ld%s%f",&p1->num,p1->name,&p1->score);
    }
    p2->next = NULL;
    free(p1);
    return head;
}

void main()
{
    struct stud *head;
    head = creat();
    print(head);
}

很显然这段代码很简单,这个创建的链表有一个头指针,但是头指指向的第一个节点data区并没有存储数据,就是说第一个节点只有第 next 是有用的,现在我想用上第一个节点的 data区,但大的循环结构又不会有太大的改变,后来我重写了creat函数,就是下面的mycreat函数:
struct stud *mycreat(void)
{
    struct stud *head,*prsn,*pnew;
    head=prsn=(struct stud * )malloc(N);
    printf("请输入学号: 姓名:  成绩(学号输入0结束)\n");
    scanf("%ld%s%f",&prsn->num,prsn->name,&prsn->score);
    if(prsn->num != 0){
        pnew=(struct stud *)malloc(N);
        scanf("%ld%s%f",&pnew->num,pnew->name,&pnew->score);
        while(pnew->num!= 0){
            prsn->next=pnew;
            prsn=pnew;
            pnew=(struct stud *)malloc(N);
            scanf("%ld%s%f",&pnew->num,pnew->name,&pnew->score);
        }
        prsn->next=NULL;
       
    }
    return head;

}

现在就能用上第一个节点的数据区了,但现在的这短代码于原来的相比较就显得结构有点复杂,不知道哪种结构更好?
还有,在创建链表的时候发现由于在你创建完一个链表后,你总要将最后一个节点的 next 只想NULL,这样的话总要保留一个指针变量(就是上面的prsn )因为最后的赋值为 prsn->next = NULL ,这样就要求在创建链表的时候最好有3个指针,一个指向头节点,一个指向当前的节点了,一个指向新创建的节点。
阅读(1049) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~