救救孩子 线性表的链式储存
1) 用C语言编写程序LinkList.cpp实现单链表的各种基本运算。2) 初始化单链表L,依次从表尾插入100个整数,并按插入顺序输出这100个整数;
3) 删除单链表L中能被3整除的元素,并把剩余元素依次输出;
4) 简单修改程序,实现双向循环链表存储结构
#include <stdio.h> #include <malloc.h> #include <time.h> #include <stdlib.h> // 单链表 struct node{ int data; struct node *next; }; // 双向链表 struct node2{ int data; struct node2 *prev; struct node2 *next; }; // 初始化单链表 struct node* initLink(int arr[], int len){ if(len<1)return NULL; struct node *h = (struct node*)malloc(sizeof(struct node)); h->data=arr[0]; h->next=NULL; struct node *p=h; for(int i=1;i<len;i++){ struct node *newNode = (struct node*)malloc(sizeof(struct node)); newNode->data=arr[i]; newNode->next=NULL; p->next=newNode;//尾插 p=p->next; } return h; } // 遍历单链表 void display(struct node *h){ printf("遍历单链表:\n"); int cols=0; while(h!=NULL){ printf("%d\t", h->data); h=h->next; printf(++cols%10==0?"\n":""); } printf("\n"); } struct node* deleteNum(struct node*h,int mark_num){ struct node *p=h->next; while(h!=NULL&&h->data%mark_num==0){// 开头被整除 struct node *q=h->next; free(h);//删除节点 h=q; } while(p!=NULL){ if(p==NULL)break; if(p->next!=NULL){ if(p->next->data%mark_num==0){//中间被整除 struct node *q=p->next->next; free(p->next);//删除节点 p->next=q; } } p=p->next; } return h; } // 单向转双向 struct node2* trans(struct node* h){ struct node2 *h2 = (struct node2*)malloc(sizeof(struct node2)); h2->prev=NULL; h2->next=NULL; struct node2 *p=h2; if(h==NULL){ return h2; } if(h!=NULL){ struct node2 *newNode = (struct node2*)malloc(sizeof(struct node2)); p->data=h->data; h=h->next; } while(h!=NULL){ struct node2 *newNode = (struct node2*)malloc(sizeof(struct node2)); newNode->data=h->data; newNode->next=NULL; newNode->prev=NULL; p->next=newNode; p=p->next; h=h->next; } p=h2; while(p->next!=NULL){ p->next->prev=p; p=p->next; } return h2; } // 遍历单链表 void display2(struct node2 *h){ printf("遍历单链表:\n"); int cols=10; while(h->next!=NULL){ printf("%d\t", h->data); h=h->next; printf(++cols%10==0?"\n":""); } printf("%d\t", h->data); printf("\nback---\n"); cols=0; while(h!=NULL){ printf("%d\t", h->data); h=h->prev; printf(++cols%10==0?"\n":""); } printf("\n"); } int main() { int len=100; int arr[len]; printf("生产%d个随机数:\n",len); srand((unsigned)time(NULL)); for(int i=0;i<len;i++){ arr[i] = rand() % 100; printf("%d\t", arr[i]); } printf("\n"); struct node *h = initLink(arr,len); display(h); int mark_num=3; h=deleteNum(h,mark_num); printf("删除被%d整除的数后:",mark_num); display(h); // 双向链表创建 struct node2*h2 = trans(h); printf("双向链表遍历"); display2(h2); printf("释放"); while(h!=NULL){ struct node*p=h; h=h->next; free(p); } while(h2!=NULL){ struct node2*p=h2; h2=h2->next; free(p); } return 0; }