2016-08-25 71 views
1

所以我一直在使用C代码(用于类)。链表由相互链接的结构组成,我试图通过链表读取链表是否有任何链接,因此可以将其删除。但是,如果链接在最后,列表中的第一个链接将取代它的位置,因此第二个链接将成为第一个链接。一个图是这样的:如何更改链接列表以便删除最后一个链接,并且第一个链接取代它?

A-> B-> C-> D-> E和应该成为B-> C-> D->一

这就是我的工作。我能够做到这一点,以便中间的任何链接都被删除,但我被困在最后一部分。任何建议都会很棒。

STUDENT *DeleteByLastName(STUDENT *students, char *name) 
{ 
    STUDENT *pHead = students; 
    STUDENT *prev = NULL; 
    int check; 

    pHead = pHead->Next; 

    while(strcmp(pHead->Lastname, name) != 0 && pHead->Next != NULL){ 
    prev = pHead; 
    pHead = pHead->Next; 
    } 
    check = strcmp(pHead->Lastname, name); 
    if (check == 0){ 
    prev->Next = pHead->Next; 
    return students; 
    } 
    else if (check != 0 && pHead->Next != NULL){ 
    prev = pHead; 
    pHead = pHead->Next; 

    check = strcmp(pHead->Lastname, name); 
     if (check == 0){ 
     pHead = students; 
     prev->Next = pHead; 
     pHead->Next = NULL; 
     students = students->Next; 
     return students; 
     } 
    } 

编辑:帮助澄清我的问题。所以我的主要问题是,我试图将链表的末尾循环到第一个元素,并将它分离以制作B-> C-> D-> A格式。我正在考虑添加结构来保存开始位置以及我想要返回的位置。但是这可能会导致我的程序失败或进入无限循环。

编辑2:代码的主体提供了,我将编辑功能来帮助完成任务。第一个是扫描每个链接,看看是否有人的姓氏,并删除该链接。然后,我将根据我写的代码来创建条件,如果名称不在我想让它回到起点的任何链接中。最后的任务是使A-B-C-D-E变成B-C-D-A。

EDIT3:它应该如何工作的一个例子: Sanka-> Robbert-> Jordan-> Blunc-> Wei->朱 和名称进行检查是朱,所以最终名单应该是这样的: Robbert-> Jordan-> Blunc-> Wei-> Sanka

+0

“我卡住了”。解释你为什么被卡住。你告诉我们你想做什么,但没有解释为什么你不能这样做。以上代码的状态是什么?它做一些你想要的东西吗?它试图做什么,但崩溃?可以...? – kaylum

+0

一种奇怪的要求..旋转第一个节点的最后一点是什么? – yano

+0

你有什么原始的东西可以帮助你?你有“删除第一”功能吗? “删除最后”功能? '添加在结束功能'?通过这三个“删除未链接节点”功能,您可以轻松完成这项工作。那些特殊情况呢?双链表是特殊的;您将以第一个节点为唯一节点。单链表是特殊的;你最终会得到你开始使用的列表,因为你删除了尾部,然后将它添加到结果空列表的尾部? –

回答

0

这里是我会做: -

你的链表是这样的: -

甲 - >乙 - “ç - > d - >电子

输出应该是: - B - > C - > D - > A

首先,遍历链表并维护2个指针,一个在开始时(currentPtr),保持稳定,一个在末尾(tailPtr),使用循环移动它。

使用strcpy(tailPtr -> name, currentPtr -> name)将currentPtr的字符串复制到tailPtr。

所以链表现在看起来像

甲 - >乙 - “ç - > d - >一个

现在,只需你就必须打破它链接到B删除第一个节点,但在此之前,您必须将您的头更新到节点B.因此,head = currentPtr -> next(它是B节点),然后将其设置为NULL,以避免非法内存访问currentPtr -> next = NULL(currentPtr指向A)并最终释放它free(currentPtr)

输出:头 - > B - > C - > D - > A

1

只需存储您的第一个STUDENT并稍后链接它。

STUDENT *DeleteLastAndMoveFirstToLast(STUDENT *students) 
{ 
    STUDENT *pFirst = students; 
    STUDENT *pHead = pFirst->Next; 

    if (!pHead) return 0; 

    STUDENT *pNext = pHead; 
    STUDENT *pNextAfterNext = pNext->Next; 

    if (pNextAfterNext) { 
    while (pNextAfterNext->Next) { 
     pNext = pNext->Next; 
     pNextAfterNext = pNext->Next; 
    } 
    } 

    pNext->Next = pFirst; 
    pFirst->Next = 0; 
    return pHead; 
}