要求功能:
- 创建学生信息表
- 头插法输入学生信息
- 尾插法输入学生信息
- 输出任意位置范围内的学生信息
- 头删法删除学生信息
- 尾删法删除学生信息
- 按位置添加学生信息
- 按位置删除学生信息
- 按位置修改学生信息
- 按位置查找学生信息
- 释放空间
今天有点累,懒得写注释了,其实思路都差不多,就是找到在操作,没什么太多区别
创建结构体
节点结构体
len:链表长度
data:节点数据
next:节点后继
cpp
typedef struct Node {
union {
int data;
int len;
};
struct Node* next;
} Node, *PNode;
创建链表
cpp
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;
}
头插法输入学生信息
cpp
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;
}
尾插法输入学生信息
cpp
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;
}
输出任意位置范围内的学生信息
cpp
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;
}
头删法删除学生信息
cpp
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;
}
尾删法删除学生信息
cpp
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;
}
按位置插入学生信息
cpp
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;
}
按位置删除学生信息
cpp
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;
}
按位置修改学生信息
cpp
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;
}
按位置查找学生信息
释放空间
cpp
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;
}
代码总和
cpp
#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;
}