又来了,写的不好请多多见谅,提出您宝贵的意见必定虚心接受,正在一点点进步。加油!!!
第二篇 单链表的增、删、改、查
typedef struct Lnode{ //和顺序表相同首先定义数据结构一个数据元素和一个指针
int data;
struct Lnode *next;
}Lnode,*Linklist;
遇到的问题:在插入和删除操作中,循环while中的控制条件有所不同,插入操作可插入的位置有n+1个而删除操作的位置有n个所以在删除操作中控制条件是while(p->next&&n<i-1)
int Insertlist(Linklist &L,Linklist s,int i){ //插入
Linklist p;
int n;
p=L;n=0;
while(p&&n<i-1){ //条件有所不同
p=p->next;
n++;
}
if(!p||n>i-1)
return ERROR;
else {
s->next=p->next;
p->next=s;
printf("插入成功\n");
}
}
int Deletelist(Linklist &L,int i){ //删除
Linklist p,q;
int n;
p=L;n=0;
while(p->next&&n<i-1){ //条件有所不同
p=p->next;
n++;
}
if(!(p->next)||n>i-1)
return ERROR;
else
q=p->next;
p->next=p->next->next;
free(q);
printf("删除成功\n");
}
整体代码C语言实现,如下
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef struct Lnode{
int data;
struct Lnode *next;
}Lnode,*Linklist;
void Creatlist(Linklist &L,int n){
int i;
Linklist p,r;
L=(Linklist)malloc(sizeof(Lnode));
L->next=NULL;
r=L;
for(i=0;i<n;i++){ //尾插法
p=(Linklist)malloc(sizeof(Lnode));
scanf("%d",&p->data);
r->next=p;
r=p;
p->next=NULL;
}
printf("创建成功\n");
}
int Insertlist(Linklist &L,Linklist s,int i){
Linklist p;
int n;
p=L;n=0;
while(p&&n<i-1){
p=p->next;
n++;
}
if(!p||n>i-1)
return ERROR;
else {
s->next=p->next;
p->next=s;
printf("插入成功\n");
}
}
int Deletelist(Linklist &L,int i){
Linklist p,q;
int n;
p=L;n=0;
while(p->next&&n<i-1){
p=p->next;
n++;
}
if(!(p->next)||n>i-1)
return ERROR;
else
q=p->next;
p->next=p->next->next;
free(q);
printf("删除成功\n");
}
void Findlist(Linklist &L,int i){ //输入所要查找的元素返回该位置
Linklist p;
int n=1;
p=L->next;
while(p){
if((p->data)==i)
printf("该数据元素位置为%d\n",n);
p=p->next;
n++;
}
if(!p)
printf("不存在\n");
}
void Updatelist(Linklist &L,int i,int e){
Linklist p;
p=L->next;
while(p){
if(p->data==i)
p->data=e;
p=p->next;
}
}
void Printlist(Linklist &L){
Linklist p;
p=L->next;
while(p){
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
}
void menu(){
printf("1.初始化创建单链表\n");
printf("2.插入\n");
printf("3.删除\n");
printf("4.查找\n");
printf("5.更改\n");
printf("6.遍历输出\n");
printf("0.退出\n");
}
int main(){
Linklist L,s;
int i,n;
menu();
while(scanf("%d",&i)){
switch(i){
case 1:
printf("请输入所要创建单链表的大小:");
scanf("%d",&n);
Creatlist(L,n);
break;
case 2:
printf("请输入所要插入的位置:");
scanf("%d",&n);
printf("请输入所要插入结点的数据元素:");
s=(Linklist)malloc(sizeof(Lnode));
scanf("%d",&s->data);
Insertlist(L,s,n);
break;
case 3:
printf("请输入所要删除结点的位置:");
scanf("%d",&n);
Deletelist(L,n);
break;
case 4:
printf("输入所要查找的数据元素:");
scanf("%d",&n);
Findlist(L,n);
break;
case 5:
printf("输入所要更改的数据元素:");
scanf("%d",&i);
printf("更改为:");
scanf("%d",&n);
Updatelist(L,i,n);
break;
case 6:
Printlist(L);break;
case 0:
exit(1);
}
}
return 0;
}
总结:在初步学习链表的相关知识时动手敲代码与用笔在纸上笔画相结合会有事半功倍的效果,一步步的走明白当前指针的指向。