1,数据结构 单链表插入

这个应该是单链表插入方法中的头插入法。 这个index确实一直是0。 但是你每次在这个第0个位置之前插入一个结点。新的结点变成勒第0个位置。之前的那个结点就变成勒第一个位置。 就是说,将每一个新插入的元素都是放在第一个结点。就是头指针指的那个第一个结点。 比如你输入的是1、2、3、4、5、 那么你输出的就是5,4,3,2,1。 因为,5,是你最后新插入的一个元素。也就放在了第一个结点的位置。 而1、是你插入的第一个原素。也就放在了最后一个结点的位置。 可能,我们看的教材不一样,我看你写的那些参数头晕。 我也刚学。但愿没说错。 共同努力吧。

数据结构 单链表插入

2,链表理解又困难啊

学好链表首先就要先理解指针和数组,链表中的线性存储就和数组差不多,还有一种就是通过指针来实现的链式存储,比如,你知道了链表中的一个元素,通过指针的指向,你就可以找出上一个元素和下一个元素的位置,链表就是这样存储的,,你哪里不懂可以说的具体点,比如,链表的初始化,计数,存取,插入,删除,归并,分拆,查找,排序,哪里难你可以问得清楚一点,趁我现在刚刚学完不久尽情的问,不然以后就忘了
链表就像一节一节的火车,每节都存放着东西,有头有尾,有些还可以做成循环的,每一节可以通过他的头指针和尾指针找到对应的前一节和后一节
if(i>pos-1||NULL==p->pNext)当pos<1时i>pos-1能排除,当pos》表长;NULL==p->pNext能排除,如果没出现这两种情则找到pos-1的位置

链表理解又困难啊

3,求问链表的内存释放问题

这段小程序是正确的: temp指向头第一个节点; 让node指向下一个节点; 释放temp所指向的第一个节点; 再重复;问题出在你对指针的认识上: free(temp); 所指向的一个节点空间*temp 被释放;temp值虽是无用的了,但并影响下面; temp=node; temp与node同时指向下一个将要释放的节点上,这里完全正确;你的认识问题就出在这!!! 解释二: 释放后,不需要 temp=NULL; 虽temp是野指针,你只要不去访问 *temp单元就没事。 -----------------------------------------------------------------------------我发现你指针的概念很乱!原话1:刚释放的节点又指向了它的下一个节点,这跟没释放时有什么区别?链表的前后连接关系完全没有改变,更没有被消灭! --> 这是我的第一个疑问,希望高手给予指点。 temp 指向的单元 *temp释放了, 但temp本身仍存在的,只不过野指针罢了,不要混淆:*temp与temp的概念区别;
1、temp是一个给定类型的指针,执行temp = node;的操作,是将指针temp指向node指向的内容,只要类型匹配,无论temp事先指向哪儿,经过赋值操作后,就会无条件地指向给定的地方。2、经过给出代码的释放操作,会释放所有结点占用的动态内存,包括头结点head,既然结点占用的内存已经还给系统了,该结点也就不复存在了,是否执行head = NULL操作,要看编程这自己的意愿,个人意见是,没必要多此一举,既然自己亲手释放了,再去操作不存在的结点就是“人”出问题了,而不是“野”指针的过错。
你对指针的理解有问题,temp只是个临时变量,你所说的temp=node表示刚刚被释放的temp(指向随意)现在又指向了node,不对,此时temp是指向随意,但是temp=node只是让temp指向node而已,相当于初始化一个指针,这里可以看出你对指针的理解有问题。另外如果要temp=NULL ,应加在在free之前。
使用free();释放函数就行了
[temp=node表示刚刚被释放的temp(指向随意)现在又指向了node(这时的node正是下一个呆释放的节点)]这里没有错。[换句话说,刚释放的节点又指向了它的下一个节点,这跟没释放时有什么区别?]temp只是一个指针变量而已,它存储的只是地址,而非链表项。所以这句话有点问题。[链表的前后连接关系完全没有改变,更没有被消灭!] 这要看你怎么理解了。释放一个链表主要的目的是为了内存的从新利用。free掉的内存里的内容是没有改变的(基本上是这样的)。所以里面的内容还是原来的。但是,这些内容是没有保护的,处于随时可用的状态(可用是指这块内存,而非里面的内容)。第二问:单个空间的定义是什么呢?int大小的空间,还是char大小呢,还是指针类型本身的空间大小。不同的指针类型(数据类型),free释放的空间大小是不同的。[比如告诉我链表需要一个节点一个节点地free。]我还真的想这么说的。链表各个节点的内存地址不一定是连续的,而且你也应当把它当成是不连续的,这是链式结构和数组的本质上的不同,所以了,各个节点之间的地址不连续,也就只能一个一个去free了。不过你也可以写个函数专门来释放链表,这样不就有了可以释放链表的free函数了吗。free使用来对应malloc的。你写个list_free来对应list就好了。别纠结在这种地方了。哦,如果你要完全清除的话用memset函数在free前将节点内容置0就好了(全部内容,包括next指针)。小子是大一还是大二呢

求问链表的内存释放问题

4,双向链表的顺序插入算法

大概看了下,你创建新节点是将指向前一个节点和指向后一个节点的指针都初始化为指向自己。如果你后期插入节点时没有修改新节点的next指针,就可能导致计算长度出现问题。最好初始化为NULL
#include #include typedef struct tagdbnode { int num; struct tagdbnode * pre; struct tagdbnode * next; } dbnode, * pdbnode; //创建结点 pdbnode createnode(int num) { pdbnode pnode = (pdbnode)malloc(sizeof(dbnode)); pnode->num = num; pnode->pre = pnode->next = pnode; //创建新结点时,让其前驱和后继指针都指向自身 return pnode; } //创建链表 pdbnode createlist(int head) //参数给出表头结点数据 (表头结点不作为存放有意义数据的结点) { pdbnode pnode = (pdbnode)malloc(sizeof(dbnode)); pnode->num = head; pnode->pre = pnode->next = pnode; return pnode; } //获取链表的长度 int getlength(pdbnode *node) // 参数为链表的表头结点 { int i=1; pdbnode x=*node; pdbnode y=x->next; while(y!=x) { y=y->next; i++; } return(i); } //插入新结点,顺序插入 pdbnode insertnode(pdbnode *node,int num) // 参数1是链表的表头结点,参数2是要插入的结点(结点数据为num) { pdbnode x=*node; pdbnode y=x; x=x->next; if(y->num { pdbnode a=(pdbnode)malloc(sizeof(tagdbnode)); a->num=num; a->next=y; a->pre=y->pre; y->pre->next=a; y->pre=a; (*node)=a;// return a; } while(x!=y) { if(x->num { pdbnode a=(pdbnode)malloc(sizeof(tagdbnode)); a->num=num; a->next=x; a->pre=x->pre; x->pre->next=a; x->pre=a; return y; } else { x=x->next; } } pdbnode a=(pdbnode)malloc(sizeof(tagdbnode)); a->num=num; a->next=y; a->pre=y->pre; y->pre->next=a; y->pre=a; return y; } //打印整个链表 void printlist(pdbnode node) // 参数为链表的表头结点 { pdbnode pnode; if (null == node) return; pnode= node->next; printf("%d ", node->num); while (pnode != node) { printf("%d ", pnode->num); pnode = pnode ->next; } printf("\n"); } //测试程序 #include #include //#include "dblist.h" #define false 0 #define true 1 void main() { int nchoose; int num; bool bflag = false; pdbnode pnode; pdbnode list = createlist(0); pdbnode *head=&list;//是指向指针的指针,因为头结点会变,而这种变化要传回来,只能用指向指针的指针 while(false == bflag) { printf("主目录\n"); printf("1. 插入一个节点\n"); printf("2. 删除一个节点\n"); printf("3. 查找节点\n"); printf("4. 打印链表\n"); printf("5. 删除链表\n"); printf("0. 退出\n\n"); scanf("%d", &nchoose); switch(nchoose) { case 1: printf("请输入要插入的数据:"); scanf("%d", &num); list = insertnode(head, num); printlist(*head); break; case 2: printf("请输入要删除的数据:"); scanf("%d", &num); //deletenode(*head, num); break; case 3: printf("请输入要查找的数据:"); scanf("%d", &num); //pnode = findnode(list, num); if (null != pnode) {printf("查找成功!\n"); } else { printf("没有这个数据!\n"); } break; case 4: printlist(list); break; case 5: //deletelist(list); break; case 6: printf("这各表的长度为: %d", getlength(head)); break; case 0: //deletelist(list); bflag = true; } } } 我的这个答案,在函数调用的时候,利用的是指向指针的指针,因为开始没有注意到你用的函数有头结点的返回值,所以和你原来给的变动较大,不过还是希望我写的你可以理解,因为我的注释较少(太懒了),所以,将就着看吧

文章TAG:刚链表带怎么放  数据结构  单链表插入  
下一篇