对单链表的创建,查找,删除,添加。
#include<stdio.h > #include<stdlib.h> struct link { int date; struct link *next; }; struct link *chuangJian(void); struct link *chaZhao(struct link *head,int num); struct link *shanChu(struct link *head,int num); struct link *tianJia(struct link *head,int num ); int main() { struct link *head=NULL,*p=NULL; head=chuangJian(); p=head; while(p!=NULL) /*不要用head指针,因为循环完之后head将指向链表的尾部,下面再用head指针将越界*/ { printf("%d ",p->date ); p=p->next ; } int n=0; printf("请输入你所查找的第N个数据:"); scanf("%d",&n); p=chaZhao(head,n); if(p==NULL) printf("结点不存在。 "); else printf("%d ",p->date); printf("请输入你要删除的第N个数据:"); scanf("%d",&n); shanChu(head,n); p=head; while(p!=NULL) { printf("%d ",p->date ); p=p->next ; } printf("请输入你要添加数据的位置:"); scanf("%d",&n); p=tianJia (head,n); if(p==NULL) printf("超出范围。 "); else while(p!=NULL) { printf("%d ",p->date ); p=p->next ; } return 0; } struct link *chuangJian(void) { struct link *head=NULL,*tail,*new; int count=0; while(1) { printf("请输入第%d个数据:",count+1); new=(struct link *)malloc(sizeof(struct link)); scanf("%d",&new->date ); new->next =NULL; if(new->date==-1) { free(new); return head; } else { count++; if(count==1) { head=tail=new; } else { tail->next =new; tail=new; } } } } struct link *chaZhao(struct link *head,int num) { int i=1; struct link *p=head; if(p==NULL) { return NULL; } while(p!=NULL&&i<num) { p=p->next ; i++; } return p; } struct link *shanChu(struct link *head,int num) { struct link *p=NULL,*q=NULL; int i=1; p=head; if(p==NULL) return NULL; else { if(num==0) { p=head; head=head->next; free(p); return head; } while(p!=NULL&&i<num-1) /*让p指向所要删除的结点的前一个结点*/ { p=p->next ; i++; } if(p==NULL) { printf("结点不存在。 "); } else { q=p->next ; p->next =q->next ; free(q); return head; } } } struct link *tianJia(struct link *head,int num ) { struct link *p=NULL,*new=NULL,*q=NULL; int i=1; if(num<1) { printf("输出位置不合法。 "); return NULL; } new=(struct link *)malloc(sizeof(struct link)); printf("请输入新建结点的数据:"); scanf("%d",&new->date ); new->next =NULL; if(head==NULL) /*将新节点插入空链表*/ { head=new; return head; } if(num==1) { p=head; /*或者new->next=head;head=new;*/ head=new; head->next =p; return head; } else { i=1; p=head; for(;i<num-1&&p!=NULL;p=p->next,i++ ); if(p==NULL) { return NULL; } q=p->next ; /*或new->next=p->next;p->next=new; */ p->next =new; new->next =q; return head; } }
总结:理解花费了不少时间,比较抽象,搞不懂了就照着课本多码几遍,画结构图想一想。