单链表(一级指针实现)
来源:互联网 发布:出售一审淘宝店铺 编辑:程序博客网 时间:2024/05/31 18:39
//基本思路和上一篇博文类似,只是本次在传输时直接传输首指针所指向的内存地址,而不是首指针自身的地址,并在每次弹出栈时返回首指针所指向的地址#include <stdio.h>#include <stdlib.h>typedef struct newlist{ int data; struct newlist *next;} onelist;onelist *insertone(onelist *old_flist,int a){ onelist *p =(onelist *)malloc(sizeof(onelist)); p->data = a; p->next=NULL; onelist * tmp,*q,*flist = old_flist; if(flist==NULL) { old_flist=p; return old_flist; ////修改首指针所存储的值,并返回此值 } else { for( q = flist; q!= NULL; q = q->next) { if(q->data>a) { old_flist=p; p->next=q; return old_flist; } else if(q->data<a&&q->next!= NULL) { if(q->data<=a&&(q->next)->data>=a) { tmp = q->next; q->next = p; p->next=tmp; return old_flist; } } else if(q->data<=a&&q->next==NULL) { q->next=p; p->next=NULL; return old_flist; } } } return old_flist;}onelist * deleteone(onelist *old_flist,int a){ onelist *flist=old_flist,*tmp=NULL,*tmp1=NULL,*tmpback=NULL; if(flist==NULL) { printf("空链表!"); return 0; } for(tmp=flist; tmp!=NULL; tmp=tmp->next) { if(tmp->data==a) { if(tmp->next!=NULL) { tmp->data=(tmp->next)->data; tmp1=(tmp->next)->next; free(tmp->next); tmp->next=tmp1; return old_flist; } else { if(tmp==flist) { old_flist=NULL; free(tmp); return old_flist; } else { tmpback->next=NULL; free(tmp); return old_flist; } } } tmpback=tmp; } return old_flist;}int main(){ onelist *flist =NULL,*tmp=NULL; int a,num,count=1; printf("请输入要插入数的个数:"); scanf("%d",&num); while(num>=count) { printf("请输入第%d个数:",count); scanf("%d",&a); flist=insertone(flist,a);//传过去首指针中所存的值,并返回修改后的首指针的值 count++; } tmp=flist; while(tmp!=NULL) { printf("%d\n",tmp->data); tmp=tmp->next; } printf("请输入您要删除的数字:"); scanf("%d",&num); flist=deleteone(flist,num); tmp=flist; printf("删除后的链表为:\n"); while(tmp!=NULL) { printf("%d\n",tmp->data); tmp=tmp->next; } return 0;}
运行结果如下: