当前位置: 代码迷 >> 综合 >> 数据结构//C——动态分配—离散存储(非循环单链表)2
  详细解决方案

数据结构//C——动态分配—离散存储(非循环单链表)2

热度:82   发布时间:2023-12-06 01:51:41.0
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
# include <stdbool.h>
//  # include <string.h>  strcpy(q->name, "张三")typedef struct Student{char name[100];int id;struct Student * pNext;
}Stu;Stu * Creat_list();
void Show_list(Stu *);
bool bool_empty_list(Stu *);
int length_list(Stu *);
bool insert_list(Stu *, int);
bool delete_list(Stu *, int);
bool deleteID_list(Stu *, int);//                         根据 学号 删除信息写不出来
void sort_list(Stu *);int main (void){Stu * pHead;pHead = Creat_list();Show_list(pHead);//    insert_list(pHead,0);
//    delete_list(pHead,1);
//    deleteID_list(pHead, 1);printf("学生人数:%d位\n", length_list(pHead));
//    sort_list(pHead);Show_list(pHead);return 0;
}
Stu * Creat_list(){Stu *pList;Stu * pHead = (Stu *) malloc(sizeof(Stu));int len;printf("请输入学生人数:");scanf("%d", &len);if(pHead->pNext == NULL || len == 0){printf("录入失败!\n");exit(-1);}pHead->pNext = NULL;pList = pHead;for (int i = 0; i < len; ++i){Stu * pNew = (Stu *) malloc(sizeof(Stu));printf("第%d名学生信息:\n", i+1);printf("姓名:");scanf("%s", pNew->name);printf("学号:");scanf("%d",&(pNew->id));pList->pNext = pNew;pNew->pNext = NULL;pList = pNew;}return pHead;
}
void Show_list(Stu * pHead){Stu * q = pHead->pNext;if(q != NULL){printf("学生信息如下:\n");} else{printf("无信息!");}while (q != NULL){printf("姓名:%s  学号:%d\n", q->name, q->id);q = q->pNext;}}
bool bool_empty_list(Stu * pHead){if(pHead->pNext == NULL){printf("无信息,无法遍历!");return true;} else{return false;}
}
int length_list(Stu * pHead){int length = 0;Stu * q = pHead->pNext;while (q != NULL){length++;q = q->pNext;}return length;
}
bool insert_list(Stu * pHead, int pos){Stu * pNew = (Stu *) malloc(sizeof(Stu));int i = 0;Stu * q = pHead;
//                 while执行几次     q = pHead              插入位置
//  pos= 1,i= 0         0           q = pHead               0——1         pHead 后面
//  pos= 2,i= 0,1       1           q = pHead->pNext        1——2        第 1 个后面
//  pos= 3,i= 0,1,2     2                                   2——3        第 2 个后面while (q != NULL && i < pos-1){q = q->pNext;i++;}if(i <= 0 || q == NULL){printf("插入位置出错!error:%d\n", pos);return false;}printf("请录入插入学生信息:\n");printf("姓名:");scanf("%s", pNew->name);printf("学号:");scanf("%d",&(pNew->id));//  q 后面插入 数据,插入位置是在 q 后面pNew->pNext = q->pNext;q->pNext = pNew;return true;
}
bool delete_list(Stu * pHead, int pos){int i = 0;Stu * q = pHead;while (q != NULL && i < pos-1){++i;q = q->pNext;}if(pos <= 0 || q == NULL){printf("删除位置出错!error:%d\n", pos);return false;} else{printf("删除成功,您删除的信息:姓名:%s  学号:%d\n", q->pNext->name, q->pNext->id);}Stu * p = q->pNext;q->pNext = q->pNext->pNext;free(p);return true;
}
void sort_list(Stu * pHead){int i;int j;Stu * p;Stu * q;int len = length_list(pHead);for (i = 0, p = pHead->pNext; i < len-1; ++i, p = p->pNext) {for (j = i+1, q = p->pNext; j < len; ++j, q = q->pNext) {if(p->id > q->id){Stu * t = p;p = q;q = t;}}}return;
}
  相关解决方案