错误代码
如果你看出错误了,这篇最想讲的你已经懂了。后附创建单链表,,返回单链表长度,输出单链表,删除所有等于x的节点,在某位置添加节点的完整代码。
//删除等于X的所有节点
void Deletelist(sqlist *&L,char x){
sqlist *p,*temp;
p=L;
while(p->next!=NULL){
if(p->next->data==x){
temp=p->next;
p=temp->next;
free(temp);
}
else
p=p->next;
}
}
对指针的理解
sqlist p 这里的sqlist 是p的类型,p可以看作变量
sqlist *p 这里的p是指针,仅可以指向和它同种类型的单链表,p的值是该 指向对象的地址
p->next p->next的值是下个节点的地址
删除节点
p->next=p->next->next;
而不是temp=p->next;p=temp->next;
上图所示代码就是错在这。
增加节点
假定s是后加节点,s->next=p->next;p->next=s;
完整代码
#include<stdio.h>
#include<malloc.h>
typedef struct Node{
char data;
struct Node *next;
}sqlist;
//创建单链表
void createlist(sqlist *&L,char arr[],int n){
sqlist *s;
L=(sqlist *)malloc(sizeof(sqlist));
L->next=NULL;
for(int i=0;i<n;i++){
s=(sqlist *)malloc(sizeof(sqlist));
s->data=arr[i];
s->next=L->next;
L->next=s;
}
}
//删除等于X的所有节点
void Deletelist(sqlist *&L,char x){
sqlist *p,*temp;
p=L;
while(p->next!=NULL){
if(p->next->data==x){
temp=p->next;
p->next=temp->next;
free(temp);
}
else
p=p->next;
}
}
//输出单链表
void print(sqlist *L){
sqlist *p;
p=L->next;
while(p!=NULL){
printf(" %c",p->data );
p=p->next;
}
}
//返回单链表长度
void lengthlist(sqlist *L){
int n=0;
sqlist *p;
p=L->next;
while(p!=NULL){
n++;
p=p->next;
}
printf("%d",n);
}
void insert(sqlist *&L,int n,char x){
sqlist *p,*s;
p=L;
for(int i=0;i<n-1;i++)
p=p->next;
s=(sqlist *)malloc(sizeof(sqlist));
s->data=x;
s->next=p->next;
p->next=s;
}
int main(){
int n,m,b;
sqlist *L;
char arr[10],a,y;
scanf("%s",arr);
createlist(L,arr,10);
print(L);
printf("\n长度:");
lengthlist(L);
printf("\n删除元素:");
scanf(" %c",&a);
Deletelist(L,a);
print(L);
printf("\n长度:");
lengthlist(L);
printf("\n插入位置,插入元素");
scanf("%d %c",&m,&y);
insert(L,m,y);
print(L);
printf("\n长度:");
lengthlist(L);
return 0;
}
注意问题
一定要让循环可以终止!!!