链表 按要求创建和删除指定位置节点问题

发布于 2022-09-12 01:50:02 字数 2955 浏览 18 评论 0

typedef int elemType;
typedef struct ListNode {
    int element;
    struct ListNode *next;
} Node;
/*
 TODO:创建单链表
 功能:补全代码,完成创建单链表的功能,前台录入一串数据,用空格隔开,输入0后,按回车完成输入。
 如果输入数字小于 0,提示:"输入数据非法,建立链表停止\n";单链表创建成功提示:"链表创建成功\n"
 如录入:1 2 3 4 5 6 7 8 9 10 0,回车,创建成功的链表为 1 2 3 4 5 6 7 8 9 10
 参数:Node *pNode 是需要操作的单链表
 返回值:链表创建成功返回链表,链表创建失败则返回null。
 */
Node *creatList(Node  *head) //尾插法;
{
            Node *p,*r;
            head=(Node *)malloc(sizeof(Node)) ;
            r=head;
            int n;
            while(1)
            {
                   scanf("%d",&n);
                   if(n<0)
                   {
                          printf("输入数据非法,建立链表停止\n");
                          return NULL;
                   }
                   else if(n>0)
                   {
                          p=(Node *)malloc(sizeof(Node));
                          p->element=n;
                          head->next=p;
                          head=p;       
                   }
                   else {
                          break;
                   }
            }
            head->next=NULL;
            printf( "链表创建成功\n") ;
            return r->next;
}
/*
 新TODO: 删除pos位置的节点
 功能:删除pos位置的节点,删除成功提示"删除pos=%d位置元素成功\n"
  * 如果pos值大于链表长度,或者小于0,删除失败提示("输入pos值非法,删除节点失败\n")
 删除成功之后,所有节点前提一位,如:1 2 3 4 5,pos = 3,
 删除后,链表为:1 2 4 5。
 参数:Node 是需要操作的单链表,pos是选择节点在链表中的位置
 返回值:删除成功返回链表pNode,删除失败返回Null。
 */

Node *deletePosElement(Node *pNode, int pos){     // 双指针
    int i = 1;
    Node *pMove;
    Node *pMovePre;
    pMovePre = pNode;   // 指向首节点;
    pMove = pNode->next; //指向首节点的下一个;
    if (pos==0)
    {
                     printf("函数执行,在pos=%d位置删除节点成功\n",pos) ;
                     return pNode->next;
    }
    while (pMove != NULL)  {
        if (i == pos) {

            pMovePre->next = pMove->next;
            free(pMove);
            printf("函数执行,在pos=%d位置删除节点成功\n",pos) ;
            return pNode;
        }
        i++;
        pMovePre = pMovePre->next;
        pMove = pMove->next;
    }
    printf("输入pos值非法,删除节点失败\n");
    return NULL;
}

调用;

void main() {
    Node *pList = NULL;  // 申请一个指针 ;
    int item;
    for (;;)     // 无限循环,选择0 退出;
            {
        switch (menu_select())     // 调用菜单函数,按返回值选择功能函数 
        {
        case 1:
            printf("请输入单链表节点(大于0的整数):\n");
            pList = creatList(pList);  
            break;
        case 2:
            printf("单链表的删除\n");
            printf("请输入要删除的标的元素item:");
            scanf("%d", &item);
            // 删除顺序表中值为item的元素的函数调用;
            pList = deletePosElement(pList, item);
            break;
        case 3:
            printf("单链表的输出\n"); //输出通讯者信息的函数调用
            printList(pList);  // 输出函数;
            break;
        case 0:
            printf("再见!\n");
            return;
        }
    }
}

上述的函数的功能实现了吗?
希望大佬解释哪儿有问题, 帮忙指出来

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文