|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 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;
- }
复制代码 就搞了这几个函数,链表还有什么操作我不知道了,抱歉
下面是源文件
写链表总感觉很晕, 逻辑总是感觉很乱,运行出错,然后又慢慢找错误,改了几次,发现我的问题了,p->next指的是下一个链表,而我思维惯性,看到p总以为是p这个链表,所以写程序之前,先搞清楚逻辑,思路,而不是先写,错了再改,这样会让人陷入痛苦之中。
上面的函数我都测试了好几遍,没发现什么问题,要是有问题,或者有更好的写法,请麻烦告之,谢谢
|
|