复习一下链表,参考书目为:算法笔记
1 #include <stdio.h> 2 #include <stdlib.h> 3 struct node 4 { 5 int data; 6 node* next; 7 }; 8 //创建链表 9 node* create(int Array[]) 10 { 11 node *p,*pre,*head;//pre保存当前结点的前驱结点,head为头结点 12 head = new node;//头结点的创建 13 head->next=NULL;//头结点不需要数据域,指针域初始为NULL 14 pre=head;//记录pre为head 15 for(int i=0;i<10;i++){ 16 p=new node;//新建结点 17 p->data=Array[i];//赋值 18 p->next=NULL;//新结点指针域设置为NULL 19 pre->next=p;//前驱结点的指针域指向新结点 20 pre=p;//把pre设为p,作为下个结点的前驱结点 21 } 22 return head;//返回头结点指针 23 } 24 //查找元素 25 //带有head头结点的链表统计数据域为x的结点个数 26 int search(node* head,int x) 27 { 28 int count=0;//计数器 29 node* p=head->next;//从第一个结点开始 30 while(p!=NULL){//循环遍历链表 31 if(p->data==x) count++;//值相等count加一 32 p=p->next; 33 } 34 return count; 35 } 36 //插入元素 37 //将x插入以head为头结点的链表的第pos和位置上 38 void insert(node* head,int pos,int x) 39 { 40 node* p=head; 41 for(int i=0;i<pos-1;i++){ 42 p=p->next; 43 } 44 node* q=new node;//创建新结点 45 q->data=x; 46 q->next=p->next; 47 p->next=q; 48 } 49 //删除元素 50 //删除以head为头结点的链表中所有数据域为x的结点 51 void del(node* head,int x) 52 { 53 node* p=head;//头结点 54 p=p->next;//头结点后的第一个结点 55 node* pre =head; 56 while(p!=NULL){ 57 if(p->data==x){ 58 pre->next=p->next; 59 delete(p); 60 p=pre->next; 61 }else{//数据域不是x,把pre和p都后移一位 62 pre=p; 63 p=p->next; 64 } 65 } 66 } 67 int main() 68 { 69 int Array[10]={5,3,6,1,2,3,3,6,3,8}; 70 node* L=create(Array);//新建链表,返回头指针head赋值给L 71 node* q=L;//头结点; 72 L=L->next;//头结点后面接的第一个带有数据域的结点 73 printf("输出所建链表的元素:"); 74 while(L!=NULL){ 75 printf("%d ",L->data);//输出每个结点的数据域 76 L=L->next; 77 } 78 //统计元素3的个数 79 printf(" 查找元素为3的个数为:%d ",search(q,3)); 80 //删除元素为6的结点 81 del(q,6); 82 printf("删除素为6的结点之后的链表;"); 83 L=q->next;//头结点后面接的第一个带有数据域的结点 84 while(L!=NULL){ 85 printf("%d ",L->data);//输出每个结点的数据域 86 L=L->next; 87 } 88 //在第5个位置插入元素1000 89 insert(q,5,1000); 90 printf(" 在第5个位置插入元素为100的结点之后的链表;"); 91 L=q->next;//头结点后面接的第一个带有数据域的结点 92 while(L!=NULL){ 93 printf("%d ",L->data);//输出每个结点的数据域 94 L=L->next; 95 } 96 return 0; 97 }
运行结果如下图: