马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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这个链表,所以写程序之前,先搞清楚逻辑,思路,而不是先写,错了再改,这样会让人陷入痛苦之中。
上面的函数我都测试了好几遍,没发现什么问题,要是有问题,或者有更好的写法,请麻烦告之,谢谢
|