以下为链表定义
struct LinkList {
LinkNode* front; // 指向头结点
LinkNode* rear; // 指向尾结点
LinkNode* pre; // 指向当前位置结点的前一个结点
LinkNode* curr; // 指向当前位置结点
int position; // 当前位置结点的编号
int len; // 线性表的大小(链表结点数)
}llist;
分析:
- 首先向机器申请内存,若申请不成功则推出程序
LinkNode *newNode=(LinkNode*)malloc(sizeof(LinkNode));
- 当前节点在链表中的位置有三种:
- 表空,当前结点为空
- 当前结点在表中
- 当前结点在表尾
- 若表空,当前结点为首结点,尾结点,pre依然为NULL,position不变,curr指向新结点
- 若当前结点在表中,pre指针加1,position加1,curr指向新结点
- 若curr指向表尾,pre指针加1,position加1,curr指向新结点,并且rear指向新结点
代码如下:
bool LL_InsAfter(LinkList* llist, T x)
// 在线性表的当前位置之后插入数据元素x。空表允许插入。当前位置指针将指向新结点。
// 若插入失败,返回false,否则返回true。
{
LinkNode *newNode=(LinkNode*)malloc(sizeof(LinkNode));
if (newNode==NULL) return false;//申请空间失败
newNode->data=x;//对新结点赋值
if (llist->len==0){
/* 在空表中插入*/
newNode->next=NULL;
llist->front = llist->rear = newNode;//头结点和尾结点都是newNode
}
else if(llist->curr==llist->rear){
/*在表尾后插入*/
newNode->next=NULL;
llist->rear->next=newNode;
llist->rear=newNode;
llist->pre++;//pre结点指向尾结点
llist->position++;
}
else {
/*在表中插入*/
newNode->next=llist->curr->next;
llist->curr->next=newNode;
llist->pre++;
llist->position++;
}
llist->curr=newNode;/*设置当前结点为新结点*/
llist->len++;/*链表的长度增加*/
return true;
}
我编写时出现的问题:
- 没有考虑当前结点在表中或表尾时,position需要加1
- 没有考虑当前结点在表中或表尾时,pre指向改变前的当前结点