yiye3376 发表于 2013-6-19 12:11:19

我的链表学习笔记

本帖最后由 yiye3376 于 2013-6-19 12:18 编辑

      这几天开始学习链表,写一个学习笔记算是对自己这几天的学习做个概括总结吧,毕竟学习是需要一个反思的过程的,这样有利于下面的学习。
      函数不多就创建链表,获得链表长度(好吧,没看概念,不知道链表是说个数还是长度:P) ,插入数据,删除数据,遍历输出链表数据,在群里面大神们的建议批评下,前后修改了好几次,算是能入各位法眼了。非常感谢他们!!
      我在cpp文件写的,要是在c文件下写,请在前面定义好变量,再在下面使用变量。
      
      一开始先创立一个最简单的链表结构
typedef struct Node    //未修改版本
{
      int data;
      struct Node *pNext;
      
}Node,*pNode;       然后创立链表
pNode create_list()    //未修改版本
{
      int num,val;       下面就是获得链表个数函数,一开始我用遍历链表得到链表个数的,但是大神们说要是链表个数1000个,1w个以上呢,你遍历得花多久呢,还有你的变量名得有意义,变量名相当于一个小注释,不要用无意义的变量名,循环中用i,j,k可以,其他的变量名起的要求意义,然后我修改了我一开始的链表结构,添加了一个变量保存链表个数,也将所有函数中的变量名修改了一些,让人更容易理解
typedef struct Node
{
      int data;
      struct Node *pNext;
      int count;            //记录是共有几个链表
}Node,*pNode;
   那下面创立链表函数就得将链表个数保存到pHead->count中了
pNode create_list()
{
      int listnum,val;
      
      pNode pNew;      
      pNode pTail;   //尾节点
      
      pNode pHead = (pNode)malloc(sizeof(Node));
      if (!pHead)
      {
                printf("分配内存失败,程序中止!");
                exit (-1);
      }
      pTail = pHead;
      pTail->pNext= NULL;
      
      printf("请输入你需要生成链表节点的个数:listnum=");
      scanf("%d",&listnum);
      
      for (int count_i=0; count_i<listnum; count_i++)//这边定义变量,代表最后用它作为链表的个数
      {
               
                printf("请输入第%d个节点的值",count_i+1);
                scanf("%d",&val);
               
                pNew = (pNode)malloc(sizeof(Node));
                if (!pNew)
                {
                        printf("分配内存失败,程序中止!");
                        exit(-1);      
                }
                pNew->data = val;
                pNew->pNext = NULL;
               
                pTail->pNext = pNew;
                pTail = pNew;
      }
      pHead->count = count_i;   //存入链表数量
      
      return pHead;
      
}   链表是否为空和链表个数函数
bool is_empty(pNode pHead)
{
      if (!(pHead->pNext))
      {
                printf("链表为空!");
                return false;
      }
      return true;
}

int get_list_num(pNode pHead)      //不需要遍历直接得出链表个数,其实我这个函数感觉有点多余了,懒得删了,                     
{                                                    //就放在上面了
      return (pHead->count);      
}



下面就是插入元素到链表中。在函数中最好插入检差参数是否合法的检测,保证参数的正确性
bool insert_list(pNode pHead,int val, int position)   //插入position之前
{
      pNode p = pHead;
      int front_pos=0;   
      
      if ((position<1) || (NULL == p))//先检测参数的正确性
      {
                return false;
      }
      
      
      while ((NULL != p) && (front_pos < position-1))   //定位插入位置,遍历到插入位置前面的链表上
      {
                p = p->pNext;
                front_pos++;
      }
      
      if ((front_pos>position-1) || !p)
      {
                return false;
      }
      
      pNode pNew = (pNode)malloc(sizeof(Node));
      if (!pNew)
      {
                printf("分配内存失败!");
                exit(-1);
      }
      pNew->data = val;
      pNew->pNext = p->pNext;
      p->pNext = pNew;
      pHead->count +=1;                     //插入一个链表,所以链表个数+1
      printf("一共有%d个链表\n",pHead->count);
      
      return true;
}
删除元素函数
bool delete_list(pNode pHead,int position)
{
      if ((!pHead) || (position<1))
      {
                return false;
      }
      
      pNode p = pHead;
      int front_pos = 0;
      while((NULL != p)&& (front_pos<position-1))//遍历到指定位置前一个链表上
      {
                p = p->pNext;
                front_pos++;
               
      }
      if ((front_pos>position-1) || !p)
      {
                return false;
      }
      
      pNode free_p = p->pNext;      
      p->pNext = free_p->pNext;
      free(free_p);
      pHead->count -=1;
      printf("一共有%d个\n",pHead->count);

      return true;
}就搞了这几个函数,链表还有什么操作我不知道了,抱歉


下面是源文件**** Hidden Message *****

写链表总感觉很晕, 逻辑总是感觉很乱,运行出错,然后又慢慢找错误,改了几次,发现我的问题了,p->next指的是下一个链表,而我思维惯性,看到p总以为是p这个链表,所以写程序之前,先搞清楚逻辑,思路,而不是先写,错了再改,这样会让人陷入痛苦之中。




上面的函数我都测试了好几遍,没发现什么问题,要是有问题,或者有更好的写法,请麻烦告之,谢谢


一站幸福 发表于 2013-6-19 12:45:55

淡定,淡定,淡定……

一站幸福 发表于 2013-6-19 12:47:48

淡定,淡定,淡定……

a02zz 发表于 2013-6-19 12:53:41

来看看是什么样子的

QQ还没找回来 发表于 2013-6-23 22:22:20

嗯,不错的总结

篱笆外的小孩儿 发表于 2013-6-24 13:07:20

带着好奇心,过来一看{:1_1:}

11年__那些事儿 发表于 2013-6-24 14:41:07

支持学数据结构!

Crazy迷恋. 发表于 2013-6-24 14:53:28

学的有点头大

在茫茫人海中静 发表于 2013-6-24 15:18:36

前辈多谢了!
   

i`ABC~ 发表于 2013-6-28 11:53:25

:o:o:o:o:o:o:o:o表示惊讶,我何时到达这地步

wulongxiang2009 发表于 2013-6-30 06:34:34

淡定淡定,能写出来就是进步

喵星人 发表于 2013-6-30 08:01:51

带着好奇心,过来一看{:1_1:}

Cocol 发表于 2013-6-30 14:50:11

我就是过来看看的

我挖 发表于 2013-6-30 16:16:40

谢谢楼主分享

coko 发表于 2013-6-30 18:42:45

学习了,谢谢楼主

over_ag 发表于 2013-6-30 19:15:35

支持个:victory:

/mg风之雪 发表于 2013-6-30 20:24:55

谢谢分享,收藏了

fishmo 发表于 2013-6-30 21:09:16

只想顶。。。。。。

qq342909729 发表于 2013-7-2 17:56:49

学习下!;P:lol

monk-half 发表于 2013-7-8 15:26:15

回复看看源文件
页: [1] 2 3 4
查看完整版本: 我的链表学习笔记