|

楼主 |
发表于 2020-4-9 12:55:43
|
显示全部楼层
没人回答。。。已自己解决。。。
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <string.h>
- struct Node;
- typedef struct Node *PNode;//指向下一个struct Node用的
- typedef double DataType;
- struct Node{
- DataType info;
- PNode link;//next指针
- };
- typedef struct Node *LinkList; //单链表类型 的指针 //用这个构建函数 返回变量为struct Node型的指针
- LinkList createNullList_link(void){
- /*构建空单链表*/
- LinkList llist = (LinkList)malloc(sizeof(struct Node));
- if(llist!=NULL) llist->link=NULL;
- else printf("构建空的单链表失败\n");
- return llist;
- }
- void isNullList_link(LinkList llist){
- /*判断是否为空链表*/
- if(llist->link==NULL){
- printf("是空链表\n");
- } else{
- printf("不是空链表\n");
- }
-
- } ;
- PNode locate_link(LinkList llist, DataType x){
- /*判断第一个元素x在单链表中存储的位置*/
- PNode p;
- if(llist==NULL) {
- printf("这个是空链表\n"); return NULL;
- } ;
-
- p = llist->link;
- while(p!=NULL&&p->info!=x){
- p = p->link;
- };
- printf("找到元素x所存储的位置\n");
- return p;//返回p,p指向的是那个节点
- }
- int insertPost_Link(LinkList llist, PNode p, DataType x){
- /*在p所指的节点(p已经是个节点了)后面插入新节点,经常与locate_link函数连用,意思实在p之后插入节点*/
- PNode q = (PNode)malloc(sizeof(struct Node));//申请新的节点
- if(q==NULL) {
- printf("新节点构建失败\n");
- return 0;
- } else {
- q->info = x;
- q->link = p->link;//q的link指向了原来p的link应该指的节点
- p->link = q;//原来的p->link 指向了q 节点
- printf("新节点插入成功\n");
- return 1;
- }
- }
- /*--------------------------------------------------*/
- PNode locatePre_link(LinkList llist, PNode p){
- /*求p所指的节点之前的节点,与函数locate_link连用*/
- PNode p1;
- if(llist==NULL) {
- printf("这是空的链表\n");
- return NULL;
- }
- p1 = llist;
- while(p1!=NULL && p1->link != p){
- p1 = p1->link;
- }
- printf("找到了\n");
- return p1;
- }
- void insertPre_Link(LinkList llist, PNode p, DataType x){
- /*在p 所指的 节点 前面插入新节点,与locatePre_link连用*/
- PNode q = (PNode)malloc(sizeof(struct Node));//申请新的节点
- if(q==NULL) {
- printf("新节点构建失败\n");
- } else {
- q->info = x;
- q->link = p->link;//q的link指向了原来p的link应该指的节点
- p->link = q;//原来的p->link 指向了q 节点
- printf("新节点插入成功\n");
- }
- }
- /*-------------------------------------------------------------------*/
- int deleteV_link(LinkList llist, DataType x){
- /*删除第一个元素值为x的节点*/
- PNode p, q;
- p = llist;
- if(p==NULL){
- printf("这是个空链表\n"); return 0;
- }
-
- while(p->link!=NULL && p->link->info!=x){
- /*p->link所指的节点的数据不等于x*/
- p = p->link;
- }
-
- if(p->link == NULL){
- printf("不存在这个存储元素的节点\n"); return 0;
- } else{
- q = p->link ;
- p->link = q->link ;
- free(q);
- printf("删除成功\n");
- return 1;
- }
- }
- int deleteP_link(LinkList llist, PNode p){
- /*删除p所指的节点*/
- if(llist==NULL){
- printf("这是个空链表\n"); return 0;
- }
-
- PNode p1;
- p1 = locatePre_link(llist, p);
- p1->link = p->link ;
- free(p);
- printf("删除成功\n");
- return 1;
-
- }
- void DisplayList(LinkList head, LinkList tail){
- //遍历带头结点的单链表
- LinkList p = head;
- if(head == NULL){
- printf("这是个空链表\n");
- }
- int i = 0;
- while((p->link== tail)==0){
- printf("%lf ",p->info );
- p = p->link;
- }
-
- printf("%lf\n", p->info);
- }
- /*--------------------------*/
- int main()
- {
- LinkList head,q,tail;
- q = createNullList_link();
- head = q;
- tail = q;
- isNullList_link(q);
-
- double info_1 = 0;
- printf("请输入第一个节点的元素:\n");
- scanf("%lf", &info_1);
- q->info = info_1;
- head = q;
- q->link = tail;
- tail == NULL;
- isNullList_link(q);
-
- PNode t = q;
-
- int i;
- printf("请输入你要插入的元素,并以-1结束\n");
- for(i = 0;; i ++ ){
- double x = 0.0;
-
- scanf("%lf",&x);
- if(x==-1) {
- t->link = tail;
- break;
- }
- int y = insertPost_Link(q,t,x);
- t = locate_link(q,x);
- }
-
-
- DisplayList(head,tail);
-
- printf("运行完毕,按任意键退出\n");
- system("pause");
- return 0;
- }
复制代码 |
|