链表操作笔记
/** 链表基本操作 增,删,查,改,创建,摧毁 2016.12.7 */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<queue> #include<algorithm> #include<stack> using namespace std; typedef struct node{ int data; struct node *next; }NODE; ///遍历链表 void showList(NODE *head){ NODE *p=head; while(p){ if(!p->next){///细节处理链表最后一个元素后加换行,其余加空格 printf("%d\n",p->data); } else{ printf("%d ",p->data); } p=p->next; } } ///摧毁链表,释放每个节点的内存 void des(NODE *p){ while(p){ des(p->next); free(p); } } ///在第一个5后面添加一个5 void addNode(NODE*head){///参数列表新的head(1)指向主函数的head(2),两个指针指向同一块内存。 NODE *p=head,*tmp; while(p->data!=5)p=p->next; tmp=(NODE*)malloc(sizeof(NODE)); tmp->data=p->data; tmp->next=p->next; p->next=tmp; } ///在每一个奇数后添加100 void addList(NODE*head){ NODE*p=head; while(p){ if(p->data%2){ NODE*q=(NODE*)malloc(sizeof(NODE)); q->data=100; q->next=p->next; p->next=q; } p=p->next; } } ///删除节点,测试为删除数据为5的节点 NODE* del(NODE**head){///指向指针的指针 NODE *p=*head,*q; q=p->next; while(q){ if(q->data==5){ p->next=q->next; free(q); q=p->next; } else{ p=p->next; q=q->next; } } if((*head)->data==5){///如果头要删除是,返回新的头指针 p=*head; *head=(*head)->next; free(p); } } int main() { NODE *head,*tail,*p; head=tail=NULL; int a; while(~scanf("%d",&a)){///创建链表,以EOF为结束 p=(NODE*)malloc(sizeof(NODE)); p->data=a; p->next=NULL; if(!head){ tail=head=p; } else{ tail->next=p; tail=p; } } //addNode(head); //addList(head); del(&head); showList(head); return 0; }