Description
输入3 4 5 6 7 9999一串整数,9999代表结束,通过尾插法新建链表,查找第二个位置的值并输出,在2个位置插入99,输出为 3 99 4 5 6 7,删除第4个位置的值,打印输出为 3 99 4 6 7。
代码
//输入3 4 5 6 7 9999一串整数,9999代表结束,
//通过尾插法新建链表,
//查找第二个位置的值并输出,
//在2个位置插入99,输出为 3 99 4 5 6 7,
//删除第4个位置的值,打印输出为 3 99 4 6 7。
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*Linklist;
void list_tail_insert(Linklist &L){
ElemType x;
L=(Linklist)malloc(sizeof(LNode));
L->next=NULL;
LNode *s,*r=L;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
}
Linklist list_find(Linklist L,int i){
int j=1;
Linklist p=L->next;
if(i==0){
return L;
}
if(i<1){
return NULL;
}
while(p&&i>j){
p=p->next;
j++;
}
return p;
}
bool list_i_insert(Linklist L,int i,ElemType x){
Linklist p=list_find(L,i-1);
if(p==NULL){
return false;
}
LNode *q=(Linklist)malloc(sizeof(LNode));
q->data=x;
q->next=p->next;
p->next=q;
return true;
}
bool list_del(Linklist L,int x){
Linklist r=list_find(L,x-1);
if(r==NULL){
return false;
}
Linklist p=r->next;
if(p==NULL){
return false;
}
r->next=p->next;
free(p);
return true;
}
void list_print(Linklist L){
L = L->next;
while (L != NULL){
printf("%3d", L->data);//打印当前结点数据
L = L->next;//指向下一个结点
}
printf("\n");
}
int main(){
Linklist L;
list_tail_insert(L);
Linklist ans;
ans=list_find(L,2);
if(ans!=NULL){
printf("%d\n",ans->data);
}
list_i_insert(L,2,99);
list_print(L);
list_del(L,4);
list_print(L);
return 0;
}
遇到的问题
- 提交后报runtime error;是list_tail_insert和list_print两个的函数类型写成了Linklist型,但其实这两个函数不需要有return,在最后main函数中,尾插法的函数生成L链表后,不需要有返回,L接下来会直接作为参数,进入print函数的调用中,而print函数直接就把链表打印出来了不需要return什么。所以两个函数类型都用void就行。
- 尾插法中
L=(Linklist)malloc(sizeof(LNode));
L->next=NULL;//不要忘了指向null,建的是空链表
3.在第i个节点处插入
if(i==0){//c++链表默认从0开始
return L;//即第一个节点
}
if(i<1){//为负
return NULL;
}
4.删除节点
r->next=p->next;//顺序!顺序!r为要删的节点的前一个节点,p为要删的节点
好了好了,差不多了☺
已经麻了