
网上有关“只有表头指针的循环单链表 插入元素问题”话题很是火热,小编也是针对只有表头指针的循环单链表 插入元素问题寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。
循环单链表指的是最后节点的指针域指向表头节点,那么如果要删除第一个元素,则只需要通过表尾指针找到第二个节点,然后将最后节点的指针指向第二个节点,这样就将第一个元素删除了,而在最后一个元素后面插入新元素也很简单,先找到表头,然后将新元素的指针域指向表头,然后再将表尾指向新元素就完成了,算法的复杂度为O(1)
而如果是只有表头指针,那么它必须遍历整个链表才能找到表尾,然后完成新元素的插入,也就是说再插入时的算法复杂度为O(n),n为链表长度
所以比较起来B更好
在线性表的链接存储中,为了方便在表头插入和删除结点的操作,经常在表头结点(存储第一个元素的结点)的前面增加一个结点,称之为头结点或表头附加结点。这样原来的表头指针由指向第一个元素的结点改为指向头结点,头结点的数据域为空,头结点的指针域指向第一个元素的结点。定义一个带头结点的线性链表类型:typedef struct LNode // 结点类型
{ElemType data;struct LNode *next;} *link,*Position;typedef struct // 链表类型{ link head, tail; // 指向头结点和最后一个结点int len; // 指示链表长度link current; // 指向当前访问的结点的指针,初始位置指向头结点}
linkList;Status MakeNode( link &p, ElemType e );// 分配由p指向的值为e的结点,并返回OK;若分配失败,则返回ERRORvoid FreeNode( link &p ); // 释放p所指结点
创建带头结点的单链线性表:
void CreateList_L(linkList&L, int n) // 逆位序输入n个元素的值,建立带表头结点的单链线性表L。
{ L = (linkList) malloc (sizeof (LNode));L->next = NULL; // 先建立一个带头结点的单链表for (i = n; i > 0; --i) {p = (linkList) malloc (sizeof (LNode)); // 生成新结点scanf(&p->data); // 输入元素值p->next = L->next; L->next = p; // 插入到表头}} // CreateList_L算法的时间复杂度为:O(Listlength(L))
a
是不带头节点的单链表为空的判定条件,head为第一个节点,要是他的内容为NULL,则整个链表都没有内容。
b
带头节点的单链表为空的判定条件,带头节点的单链表的头节点head总是不空的,但是他的里面不存储具体的内容。他的下一个节点才是存储内容的开始,若没有下一个节点,则表示该链表没有存储内容。
所以选b
一般双向链表节点定义 struct node{struct node*prev; struct node *next};插入一个新节点,struct node * newnode; 该新节点的prev要指向前面一个节点,next指向后面一个节点,前面一个节点的next要指向newnode,newnode 后面一二节点的prev要指向newnode,所以要修改4个指针,这个画个图 最好理解了
关于“只有表头指针的循环单链表 插入元素问题”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!