本节设计题目:
1. 建立一个单链表,并存入50个85到100之间的随机数。
2. 分别用递推和递归两种方法分别遍历第一题中的链表。
3. 在第一题的链表中建立一个查找函数struct node* find(int x, struct node* head), 其中head是查找链表的头结点, x 是要查找的数,若找到返回指向该结点的指针,没找到返回空指针。应用该函数查找95以测试该函数。
4. 在第一题的链表中查找90,若找到则在其后插入值为-1的新结点。
5. 在第一题的链表中查找大于95的结点,并在这些结点的前面插入值为-1的新结点。
6. 在第一题的链表中删除大于95的所有结点。
具体基础知识大家可以自行查阅书籍,下面是代码:
#include<stdio.h> #include<stdlib.h> typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //递归函数 void fun(LinkList p) { if(p->next == NULL) { printf("%d ",p->data); printf("\n"); printf("遍历结束"); } else { printf("%d ",p->data); p = p->next; fun(p); } } //查找函数 LNode *find(int x,LinkList p) { int i=1; while(p != NULL) { if(p->data == x) { printf("要查找的数在第%d位\n",i); return p; } p = p->next; i+=1; } printf("不存在要查找的数字!\n"); return p; } //查找后面插入-1 void *finfAndInsert_end(int x,LinkList p) { while(p != NULL) { if(p->data == x) { LinkList s; s=(LinkList)malloc(sizeof(LNode)); s->data = -1; s->next = p->next; p->next = s; } p = p->next; } return 0; } //查找大于x前面插入-1 void *findAndInsert_before(int x,LinkList p) { while(p != NULL) { if(p->data > x) { LinkList s; s=(LinkList)malloc(sizeof(LNode)); s->data = p->data; s->next = p->next; p->next = s; p->data = -1; p = s->next; }else{ p = p->next; } } return 0; } //删除大于x的结点 void deleteLNode(int x,LinkList p) { LinkList q; q = p->next; while(q != NULL) { if(q->data > x) { p->next=q->next; q = p->next; }else { p = p->next; q = q->next; } } } int main() { int i=0; int x; LinkList s,L,p; L=(LinkList)malloc(sizeof(LNode)); L->next = NULL; /*******************************1、建立单链表,并插入数据*************************************************/ //头插法 // printf("头插入法:\n"); for(i=0;i<50;i++) { s=(LinkList)malloc(sizeof(LNode)); s->data = rand()%15+85; s->next = L->next; L->next = s; } /* //尾插法 printf("尾插入法:\n") for(i=0;i<50;i++) { s=(LinkList)malloc(sizeof(LNode)); printf("当前插入的数字为:%d\n",rand()%15+85); s->data = rand()%15+85; s->next = NULL; if(L->next == NULL) { L->next = s; s->next = NULL; }else { p = L; while(p->next != NULL) { p = p->next; } p->next = s; } } */ // printf("插入的数为:\n"); /*******************************2、递推和递归法遍历单链表*************************************************/ //递推法遍历 printf("递推法遍历的结果为:\n"); p = L->next; while(p) { printf("%d ",p->data); p=p->next; } printf("\n"); printf("遍历结束\n"); //递归法遍历 printf("递归法遍历的结果为:\n"); p = L->next; fun(p); printf("\n"); /*******************************3、查找函数*************************************************/ printf("请输入要查找的数字:\n"); scanf("%d",&x); find(x,L->next); /*******************************4、查找90,并在后面添加值为-1的新结点*************************************************/ printf("请输入你要执行插入-1的数字:\n"); scanf("%d",&x); finfAndInsert_end(x,L->next); printf("插入后的结果为:\n"); p = L->next; while(p) { printf("%d ",p->data); p=p->next; } printf("\n"); /*******************************5、查找大于95的结点,并在前面添加值为-1的新结点*************************************************/ printf("请输入你要插入的比较的数字:\n"); scanf("%d",&x); findAndInsert_before(x,L->next); printf("插入后的结果为:\n"); p = L->next; while(p) { printf("%d ",p->data); p=p->next; } printf("\n"); /*******************************6、删除大于95的所有结点*************************************************/ printf("请输入你要删除的比较的数字:\n"); scanf("%d",&x); deleteLNode(x,L->next); printf("删除后的结果为:\n"); p = L->next; while(p) { printf("%d ",p->data); p=p->next; } printf("\n"); return 0; }如有问题,请及时提出,谢谢!