【问题描述】删除单链表(带头结点,头插入法建立单链表)的第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了
不知道你这个问题是否已经解决, 如果还没有解决的话: