幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2348|回复: 4

[通用编程] 继续是链表

[复制链接]

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
发表于 2007-6-19 23:20:57 | 显示全部楼层 |阅读模式
#include<stdio.h>
#include<stdlib.h>
struct list
{
    char data;
    struct list *next;
}*head;
setnull(struct list **p)   //置空
{
    *p=NULL;
}
int length(struct list **p) //求链表的长度
{
    int n=0;
    struct list *q=*p;
    while(q!=NULL)
    {
        n++;
        q=q->next;
    }
    return n;
}
void insert(struct list **p,char x,int i)//插入元素
{
    int j=1;
    struct list *s,*q;
    s=(struct list *)malloc(sizeof(struct list));
    s->data=x;
    s->next=NULL;
    q=*p;
    if(i==1)
    {
        s->next=q;
        *p=s;
    }
    else
    {
        while(j<i-1&&q->next!=NULL)
        {
            q=q->next;
            j++;
        }
        if(j==i-1)
        {
            if(q->next!=NULL)
            {
            s->next=q->next;
            q->next=s;
            }
            else
            {
                q->next=s;
            }
        }
        else
            printf("位置不正确.");
    }
}
void del(struct list **p,int i)//删除链表中的元素
{
    int j=1;
    struct list *t,*q;
    q=*p;
    if(i==1)
    {
        t=q;
        *p=q->next;
    }
    else
    {
        while(j<i-1&&q->next!=NULL)
        {
            q=q->next;
            j++;
        }
        if(j==i-1)
        {
            t=q->next;
            q->next=t->next;
        }
        else
            printf("位置不对.");
    }
        if(t!=NULL)
            free(t);
   
}
void display(struct list **p)//显示链表中的元素
{
    struct list *q;
    q=*p;
    printf("单链表显示:");
    if(q==NULL)
        printf("链表为空!");
    else if(q->next==NULL)
        printf("%c",q->data);
    else
    {
        while(q->next!=NULL)
        {    printf("%c-",q->data);
            q=q->next;
        }
        printf("%c",q->data);
    }
    printf("\n");

}
void main()
{
   
    setnull(&head);
   
   
    insert(&head,'a',1);
    insert(&head,'c',2);
    insert(&head,'b',2);
   
   
    display(&head);
    del(&head,1);
    display(&head);
}

在删除元素的这一个部分
void del(struct list **p,int i)//删除链表中的元素
{
    int j=1;
    struct list *t,*q;
    q=*p;
    if(i==1)
    {
        t=q;
        *p=q->next;
    }
    else
    {
        while(j<i-1&&q->next!=NULL)
        {
            q=q->next;
            j++;
        }
        if(j==i-1)
        {
            t=q->next;
            q->next=t->next;
        }
        else
            printf(\"位置不对.\");
    }
        if(t!=NULL)
            free(t);
   
}
为什么当删除一位置的这个元素时一定要写成这样
  if(i==1)
    {
        t=q;
        *p=q->next;
    }
其实删除位置是一的话,只需要这一句就行了, *p=q->next;   为什么还要加上一句 t=q;  呢?
把这句去掉了,就不行了,到底为什么会这样呢?这句 t=q; 又是什么意思呢?
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复

使用道具 举报

7

主题

190

帖子

1766

积分

⑥精研

....

积分
1766
发表于 2007-6-20 10:40:49 | 显示全部楼层
- -若是没有t=q的话,最后这句
   if(t!=NULL)
            free(t);
就不会执行,因为t仅仅声明没有赋值,默认是NULL,所以,头结点(也是唯一的结点)q没有释放.
反复的执行删除单结点链表最后将导致内存资源没有释放,内存溢出.

另PS句,这段代码不看也罢,写的水平实在一般,变量名标识极差.只能让原本郁闷的人更加郁闷摸不清头脑.另外方法过于简单,技巧性低...呃,不说了..若是新人练习之作的话可以理解,若是教材上的代码,可以说,这教材的实用性值得怀疑. [s:7]
萝卜啊,白菜啊,土豆星啊,梦想有爱啊。
回复 支持 反对

使用道具 举报

7

主题

190

帖子

1766

积分

⑥精研

....

积分
1766
发表于 2007-6-20 10:41:56 | 显示全部楼层
另外,请多注意双向链表,就个人所见,DoubleList明显使用几率远大于SingleList [s:2]
萝卜啊,白菜啊,土豆星啊,梦想有爱啊。
回复 支持 反对

使用道具 举报

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
 楼主| 发表于 2007-6-21 22:04:13 | 显示全部楼层
引用第1楼duzhi5368于2007-06-20 10:40发表的  :
- -若是没有t=q的话,最后这句
   if(t!=NULL)
            free(t);
就不会执行,因为t仅仅声明没有赋值,默认是NULL,所以,头结点(也是唯一的结点)q没有释放.
反复的执行删除单结点链表最后将导致内存资源没有释放,内存溢出.
.......

这确实是教材里抄下来的,而且是清华大学出版社出版的[s:4]
而你说的严蔚敏,吴伟民:《数据结构》又不知从何找,现在数据结构的书都不好找了[s:6]
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复 支持 反对

使用道具 举报

19

主题

842

帖子

1万

积分

⑧专业

絕望青年,一起增高吧

积分
13676
发表于 2007-6-21 22:25:21 | 显示全部楼层
這些都是網上找的,wiki也不錯

為著彼岸,便要與之妥協 但為著彼岸,更不能與之妥協

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-4-29 07:46 , Processed in 0.019367 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表