问题描述】删除单链表(带头结点,头插入法建立单链表)的第i个结点

【问题描述】删除单链表(带头结点,头插入法建立单链表)的第i个结点

【样例输入1】

                   5

                   6 7 8 9 10

                   3

【样例输出1】 10 9 7 6

【样例输入2】

                 1

                 8

                 1

【样例输出2】 null

【样例输入3】

                 1

                 8

                 2

【样例输出2】 error

【样例说明】第一行输入链表长度5,第二行依次输入链表元素,以空格间隔,第三行输入删除的元素序列3.

                 以空格间隔依次输出删除后的单链表元素,若为空表则输出null,若为无效删除,则输出error
#include
#include 
#define ERROR 0
#define OK 1
using namespace std;
typedef struct LNode
{
    int data;
    struct LNode *next;
}LNode,*linklist;
void Initlist(linklist &L)
{
    L=(LNode*)malloc(sizeof(LNode));
    L->next=NULL;
}
void creatlist(linklist &L,int n)
{
    L=(LNode*)malloc(sizeof(LNode));
    L->next=NULL;
    for(int i=0;imalloc(sizeof(LNode));
        cin>>p->data;
        p->next=L->next;
        L->next=p;
    }
}
int Listdelete(linklist &L,int i)
{
    LNode *p,*q;
    int j=0;
    while(p->next&&j-1)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)
        return ERROR;
    q=p->next;
    p->next=q->next;
    delete q;
    return OK;
}
void print(linklist &L)
{
    LNode *p;
    p=L->next;
    if(p)
    {    while(p)
        {
            cout<data ;
              p=p->next;
        }
    }
    else if(p==NULL)
        cout<<"null";
    else
        cout<<"error";
                
}
int main()
{
    int n,i;
    cin>>n;
    linklist L;
    Initlist(L);
    creatlist(L,n);
    cin>>i;
    Listdelete(L,i);
    print(L);
    return 0;
}

运行不出来该怎么改?

整体修改如下,改动处见注释,供参考:

#include <iostream>
#include <malloc.h> 
#define ERROR 0
#define OK 1
using namespace std;
typedef struct LNode
{
    int    data;
    struct LNode* next;
}LNode, * linklist;
void Initlist(linklist& L)
{
    L = (LNode*)malloc(sizeof(LNode));
    L->next = NULL;
}
void creatlist(linklist L, int n)  //修改
{
    //L = (LNode*)malloc(sizeof(LNode)); 这里两行多余,前面已经有初始化函数
    //L->next = NULL;                    修改
    for (int i = 0; i < n; i++)
    {
        LNode* p;
        p = (LNode*)malloc(sizeof(LNode));
        cin >> p->data;
        p->next = L->next;
        L->next = p;
    }
}
int Listdelete(linklist L, int i) //修改
{
    LNode* p = L, * q;  // 修改
    int j = 0;
    if (i < 1)          // 修改
        return ERROR;
    while (p->next && j < i - 1)
    {
        p = p->next;
        ++j;
    }
    if (!p->next) //|| j > i - 1) 修改
        return ERROR;
    q = p->next;
    p->next = q->next;
    free(q);      //delete q; 修改
    return OK;
}
void print(linklist L) //修改
{
    LNode* p;
    p = L->next;
    if (p)
    {
        while (p)
        {
            cout << p->data << " ";  //修改
            p = p->next;
        }
    }
    else //if (p == NULL)  修改
        cout << "null";
    //else                修改
    //    cout << "error";  修改
}
int main()
{
    int n, i;
    cin >> n;
    linklist L;
    Initlist(L);
    creatlist(L, n);
    cin >> i;
    if (ERROR == Listdelete(L, i)) //修改
        cout << "error";           //修改  
    else                           //修改    
        print(L);                  //修改  
    return 0;
}

LNode *p,*q;
int j=0;
while(p->next&&j<i-1)
{
    p=p->next;
    ++j;
}

目测这里p是野指针,没有赋值就while了

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/1064608
  • 这篇博客你也可以参考下:动态规划解决三角形路径,自顶向下法和 备忘录法
  • 除此之外, 这篇博客: 【计科快速入门】五、算术逻辑单元中的  2.3 8位行波进位加法器 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    • 全加器作为独立组件,全加器会把A,B,C三个输入加起来输出"总和"和"进位"。现在有了新组件,我们可以相加两个8位数字,叫两个数字叫A和B,我们从A和B的第一位开始,叫A0和B0。因为是第一次加法,不用处理任何进位 ,所以我们可以用半加器,来加这2个数字,输出叫sum0,然后,加A1和B1,因为A0和B0的结果有可能进位,所以这次要用全加器,除了A1和B1,还要连上进位。输出叫sum1,然后,把这个全加器的进位连到下个全加器的输入,处理A2和B2,以此类推,把8个bit都搞定。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^