DAY15:链表实现学生信息管理系统
要求功能:
- 创建学生信息表
- 头插法输入学生信息
- 尾插法输入学生信息
- 输出任意位置范围内的学生信息
- 头删法删除学生信息
- 尾删法删除学生信息
- 按位置添加学生信息
- 按位置删除学生信息
- 按位置修改学生信息
- 按位置查找学生信息
- 释放空间
今天有点累,懒得写注释了,其实思路都差不多,就是找到在操作,没什么太多区别
创建结构体
节点结构体
len:链表长度
data:节点数据
next:节点后继
typedef struct Node {union {int data;int len;};struct Node* next;
} Node, *PNode;
创建链表
PNode linklist_creat() {PNode p = (PNode) malloc(sizeof(Node));if(NULL == p){printf("创建失败!\n");return NULL;}p->len = 0;p->next = NULL;printf("创建成功!\n");return p;
}
头插法输入学生信息
int linklist_head_insert(PNode linklist, int num) {if(NULL == linklist) return -1;printf("请输入 %d 个数据:\n",num);for (int i = 0; i < num; ++i) {PNode temp = (PNode) malloc(sizeof(Node));scanf("%d",&temp->data);//头插temp->next = linklist->next;linklist->next = temp;//改变长度记录linklist->len++;}printf("头插 %d 个元素成功!\n",num);return 1;
}
尾插法输入学生信息
int linklist_tail_insert(PNode linklist, int num) {if(NULL == linklist) return -1;printf("请输入 %d 个数据:\n",num);PNode p = linklist;while (p->next != NULL){p = p->next;}for (int i = 0; i < num; ++i) {PNode temp = (PNode) malloc(sizeof(Node));scanf("%d",&temp->data);temp->next = NULL;p->next = temp;p = p->next;linklist->len++;}printf("尾插 %d 个元素成功!\n",num);return 1;
}
输出任意位置范围内的学生信息
int linklist_output(PNode linklist, int out_begin, int out_end) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(out_begin > out_end){printf("输入顺序出错!\n");return 0;}if(out_begin < 1 || out_end > linklist->len){printf("输入不在链表范围内");return 0;}PNode temp = linklist->next;int count = 1;while (count < out_begin){temp = temp->next;count++;}for (int i = out_begin; i <= out_end; ++i) {printf("%d ",temp->data);temp = temp->next;}printf("\n");printf("输出 %d 到 %d 个元素完成!\n",out_begin,out_end);return 1;
}
头删法删除学生信息
int linklist_head_delete(PNode linklist, int num) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(num > linklist->len){printf("输入长度超过链表长度!\n");return 0;}for (int i = 0; i < num; ++i) {//创建删除指针PNode temp = linklist->next;//断开链接linklist->next = temp->next;//释放删除节点temp->next = NULL;free(temp);temp = NULL;linklist->len--;}printf("头删 %d 个元素完成!\n",num);return 1;
}
尾删法删除学生信息
int linklist_tail_delete(PNode linklist, int num) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(num > linklist->len || num < 1){printf("输入长度超过链表长度!\n");return 0;}for (int i = 0; i < num; ++i) {PNode temp = linklist;while (temp->next->next != NULL){temp = temp->next;}free(temp->next);temp->next = NULL;linklist->len--;}printf("尾删 %d 个数据成功!\n",num);return 1;
}
按位置插入学生信息
int linklist_set_insert(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len + 1 || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置前面那个位置PNode temp = linklist;int count = 0;while (count < set){temp = temp->next;count++;}PNode new_node = (PNode) malloc(sizeof(Node));printf("请输入要插入的值:");scanf("%d",&new_node->data);new_node->next = temp->next;temp->next = new_node;linklist->len++;printf("插入新数据到 %d 位置成功\n",set);return 1;
}
按位置删除学生信息
int linklist_set_delete(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置前面那个位置PNode temp = linklist;int count = 1;while (count < set){temp = temp->next;count++;}PNode p = temp->next;temp->next = p->next;free(p);linklist->len--;printf("删除 %d 位置的数据成功\n",set);return 1;
}
按位置修改学生信息
int linklist_set_change(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置PNode temp = linklist->next;int count = 1;while (count < set){temp = temp->next;count++;}printf("当前值为: %d\n",temp->data);printf("请输入要修改的值:");scanf("%d",&temp->data);printf("修改成功!\n");return 1;
}
按位置查找学生信息
释放空间
int linklist_free(PNode linklist) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}while (linklist->next != NULL){PNode p = linklist->next;linklist->next = p->next;p->next = NULL;free(p);p = NULL;}printf("释放成功!\n");return 1;
}
代码总和
#include <stdio.h>
#include <malloc.h>//节点结构体,len:链表长度,data:节点数据,next:节点后继
typedef struct Node {union {int data;int len;};struct Node* next;
} Node, *PNode;PNode linklist_creat();int linklist_free(PNode linklist);int linklist_head_insert(PNode linklist, int num);int linklist_tail_insert(PNode linklist, int num);int linklist_output(PNode linklist, int out_begin, int out_end);int linklist_head_delete(PNode linklist, int num);int linklist_tail_delete(PNode linklist, int num);int linklist_set_insert(PNode linklist, int set);int linklist_set_delete(PNode linklist, int set);int linklist_set_change(PNode linklist, int set);int linklist_set_find(PNode linklist, int set);int main(){PNode linklist;int chose;for (;;) {printf("请输入你的选择:");scanf("%d",&chose);if(chose == 0){printf("当前链表长度为:%-5d\n",linklist->len);} else if(chose == 1){//创建头节点linklist = linklist_creat();} else if(chose == 2){//头插int num;printf("请输入要头插节点的数量:");scanf("%d",&num);linklist_head_insert(linklist,num);} else if(chose == 3){//尾插int num;printf("请输入要尾插节点的数量:");scanf("%d",&num);linklist_tail_insert(linklist,num);} else if(chose == 4){//遍历链表int out_begin,out_end;printf("当前链表长度为:%-3d\n",linklist->len);printf("请输入要遍历的起始位置和结束位置:");scanf("%d %d",&out_begin,&out_end);linklist_output(linklist,out_begin,out_end);} else if(chose == 5){//头删int num;printf("请输入要头删的数量:");scanf("%d",&num);linklist_head_delete(linklist,num);} else if(chose == 6){//尾删int num;printf("请输入要尾删的数量:");scanf("%d",&num);linklist_tail_delete(linklist,num);}if(chose == 7){//任意位置插入int set;printf("请输入要插入的位置:");scanf("%d",&set);linklist_set_insert(linklist,set);}if(chose == 8){//任意位置删除int set;printf("请输入要删除的位置:");scanf("%d",&set);linklist_set_delete(linklist,set);}if(chose == 9){//任意位置修改int set;printf("请输入要修改的位置:");scanf("%d",&set);linklist_set_change(linklist,set);}if(chose == 10){//任意位置查找int set;printf("请输入要查找的位置:");scanf("%d",&set);linklist_set_find(linklist,set);}else if(chose == -1){//释放内存,指针指空linklist_free(linklist);free(linklist);linklist = NULL;break;}printf("\n");}return 0;
}int linklist_set_find(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置PNode temp = linklist->next;int count = 1;while (count < set){temp = temp->next;count++;}printf("第 %d 个数据为 %d\n",set,temp->data);return 1;
}int linklist_set_change(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置PNode temp = linklist->next;int count = 1;while (count < set){temp = temp->next;count++;}printf("当前值为: %d\n",temp->data);printf("请输入要修改的值:");scanf("%d",&temp->data);printf("修改成功!\n");return 1;
}int linklist_set_delete(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置前面那个位置PNode temp = linklist;int count = 1;while (count < set){temp = temp->next;count++;}PNode p = temp->next;temp->next = p->next;free(p);linklist->len--;printf("删除 %d 位置的数据成功\n",set);return 1;
}int linklist_set_insert(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len + 1 || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置前面那个位置PNode temp = linklist;int count = 0;while (count < set){temp = temp->next;count++;}PNode new_node = (PNode) malloc(sizeof(Node));printf("请输入要插入的值:");scanf("%d",&new_node->data);new_node->next = temp->next;temp->next = new_node;linklist->len++;printf("插入新数据到 %d 位置成功\n",set);return 1;
}int linklist_tail_delete(PNode linklist, int num) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(num > linklist->len || num < 1){printf("输入长度超过链表长度!\n");return 0;}for (int i = 0; i < num; ++i) {PNode temp = linklist;while (temp->next->next != NULL){temp = temp->next;}free(temp->next);temp->next = NULL;linklist->len--;}printf("尾删 %d 个数据成功!\n",num);return 1;
}int linklist_head_delete(PNode linklist, int num) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(num > linklist->len){printf("输入长度超过链表长度!\n");return 0;}for (int i = 0; i < num; ++i) {//创建删除指针PNode temp = linklist->next;//断开链接linklist->next = temp->next;//释放删除节点temp->next = NULL;free(temp);temp = NULL;linklist->len--;}printf("头删 %d 个元素完成!\n",num);return 1;
}int linklist_output(PNode linklist, int out_begin, int out_end) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(out_begin > out_end){printf("输入顺序出错!\n");return 0;}if(out_begin < 1 || out_end > linklist->len){printf("输入不在链表范围内");return 0;}PNode temp = linklist->next;int count = 1;while (count < out_begin){temp = temp->next;count++;}for (int i = out_begin; i <= out_end; ++i) {printf("%d ",temp->data);temp = temp->next;}printf("\n");printf("输出 %d 到 %d 个元素完成!\n",out_begin,out_end);return 1;
}int linklist_tail_insert(PNode linklist, int num) {if(NULL == linklist) return -1;printf("请输入 %d 个数据:\n",num);PNode p = linklist;while (p->next != NULL){p = p->next;}for (int i = 0; i < num; ++i) {PNode temp = (PNode) malloc(sizeof(Node));scanf("%d",&temp->data);temp->next = NULL;p->next = temp;p = p->next;linklist->len++;}printf("尾插 %d 个元素成功!\n",num);return 1;
}int linklist_head_insert(PNode linklist, int num) {if(NULL == linklist) return -1;printf("请输入 %d 个数据:\n",num);for (int i = 0; i < num; ++i) {PNode temp = (PNode) malloc(sizeof(Node));scanf("%d",&temp->data);//头插temp->next = linklist->next;linklist->next = temp;//改变长度记录linklist->len++;}printf("头插 %d 个元素成功!\n",num);return 1;
}int linklist_free(PNode linklist) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}while (linklist->next != NULL){PNode p = linklist->next;linklist->next = p->next;p->next = NULL;free(p);p = NULL;}printf("释放成功!\n");return 1;
}PNode linklist_creat() {PNode p = (PNode) malloc(sizeof(Node));if(NULL == p){printf("创建失败!\n");return NULL;}p->len = 0;p->next = NULL;printf("创建成功!\n");return p;
}