6、尾删数据
代码:
void DListPopBack(DListNode* head) //尾删数据 { assert(head); //首先要判定一下传入的head 是不是空指针 if (head->next == head) // 判断是不是空链表 { printf("DEL error :Empty linked lists cannot be deleted");//如果是空链表则不能删除 return; } DListNode* Headprove = head->prove; //尾删数据 DListNode* proveProve = Headprove->prove;//改变指针的方向 proveProve->next = head; head->prove = proveProve;
代码解释:
- 要想删除肯定要确保链表里面有东西可以删除,所以先判断一下是不是空链表,如果空链表的话就提示用户不能删除。
- 尾删数据的时候,最关键的还是找尾部节点(这个步骤跟上面的尾插一样的)
- 找到尾部节点以后进行删除。
7、查找数组(返回查找数据的地址)
代码:
DListNode* DListFind(DListNode* head, DLTDateType x) //查找链表中的X值,返回该节点的地址 { DListNode* cup = head->next; //利用局部变量来记录链表的表头,方便后面的遍历 while (cup != head) //遍历链表 { //cup = cup->next; if (cup->data == x) { return cup; } cup = cup->next; //局部变量自增 } printf("Not found\n"); return NULL; }
8、在链表X数据之后插入y
代码:
void DListInsertAfter(DListNode* head, DLTDateType x, DLTDateType y) //X位置之后插入y { DListNode* pos = DListFind(head, x); DListNode* newnode = BuyDListNode(x); newnode->data = y; DListNode* next = pos->next; next->prove = newnode; newnode->next = next; newnode->prove = pos; pos->next = newnode; }
9、在链表X数据之前插入y
代码:
void DListInsertBefor(DListNode* head, DLTDateType x, DLTDateType y) //X位置之前插入y { DListNode* pos = DListFind(head, x); DListNode* newnode = BuyDListNode(x); newnode->data = y; DListNode* prove = pos->prove; prove->next = newnode; newnode->prove = prove; newnode->next = pos; pos->prove = newnode; }
10、把链表中的X值修改为y
代码;
DListChange(DListNode* head, DLTDateType x, DLTDateType y) 修改在X位置的值 { DListNode* pos = DListFind(head, x); assert(pos); pos->data = y; }
11、把链表中X值所在的结点删除
void DListErase(DListNode* head, DLTDateType x) // 链表删除pos位置的值 { DListNode* pos = DListFind(head, x); assert(pos); DListNode* prove = pos->prove; DListNode* next = pos->next; prove->next = next; next->prove = prove; }
12、把链表中X值之前的一个结点删除
void DListEraseBefore(DListNode* head, DLTDateType x) // 链表删除pos位置之前的值 { DListNode* pos = DListFind(head, x); assert(pos); DListErase(head, pos->prove->data); }
13、把链表中X值之后的一个结点删除
void DListEraseAfter(DListNode* head, DLTDateType x) // 链表删除pos位置之后的值 { DListNode* pos = DListFind(head, x); assert(pos); DListErase(head, pos->next->data); }
14、链表的销毁
void DListDestroy(DListNode* head) // 链表的销毁 { DListNode* cup = head->next; while (cup != head) { DListNode* pos = cup; cup = cup->next; free(pos); pos = NULL; } }