c语言实现链表的创建、增、删、改、查
来源:互联网 发布:程序员联合开发网 编辑:程序博客网 时间:2024/05/19 10:36
//// main.c// 链表的基本操作// Created by fzl // Copyright © fzl All rights reserved.//#include <stdio.h>#include <stdlib.h>#define FILENAME "/Users/fzl/Desktop/2.txt"struct Student{ int num; char name[20];};typedef enum Same{ isSame, isDifferent}Same;typedef struct Student Student;struct LINK{ Student data; struct LINK *next;};typedef struct LINK LINK;typedef LINK * pLINK;Same SameOrNot(pLINK head,Student stu){ pLINK temp=head->next; for (; temp!=NULL; temp=temp->next) { if(temp->data.num==stu.num) { return isSame; } } if(temp==NULL) { return isDifferent; } return isSame;}/** 创建链表 */pLINK createList(pLINK head){ if(NULL==head) { //定义头结点 head=(pLINK)malloc(sizeof(LINK)); head->next=NULL; } printf("创建链表成功\n"); return head;}/**打印链表 */void printList(pLINK head){ if(head==NULL) { printf("没有创建链表\n"); return; } if(head->next==NULL) { printf("无信息打印\n"); return; } pLINK temp=head->next; for (; temp!=NULL; temp=temp->next) { printf("[%d %s]--->",temp->data.num,temp->data.name); } printf("NULL\n");}Student getData(pLINK head){ Student stu; while (1) { printf("请输入插入学生的信息[学号 姓名]:"); scanf("%d%s",&stu.num,stu.name); if(SameOrNot(head, stu)==isSame) { printf("输入重复\n"); } else { return stu; } } return stu;}/**头插 */void headInsert(pLINK head){ //新建节点 pLINK p=(pLINK)malloc(sizeof(LINK)); //填补数据域 p->data=getData(head); //将新建的节点连到链表中 p->next=head->next; head->next=p; printf("头插成功\n");}void tailInsert(pLINK head){ pLINK p=(pLINK)malloc(sizeof(LINK)); p->data=getData(head); if(head->next==NULL) { head->next=p; p->next=NULL; return ; } pLINK tail=head->next; for (;tail->next!=NULL; tail=tail->next) { } //如果循环能跳出,则tail->next==NULL,说明tail就是尾指针 tail->next=p; p->next=NULL; printf("尾插成功\n");}int getListLength(pLINK head){ pLINK temp=head->next; int length=0; for (; temp!=NULL; temp=temp->next) { length++; } return length;}void randomInsert(pLINK head){ int index=0; printf("请输入要插入的位置:"); scanf("%d",&index); if(index<=0||index>getListLength(head)+1) { printf("你输入的位置有误\n"); } if(index==1) { headInsert(head); } else if (index==getListLength(head)+1) { tailInsert(head); } else { pLINK front; int i; for (front=head->next,i=1; i<index-1; front=front->next,i++) { } pLINK p=(pLINK)malloc(sizeof(LINK)); p->data=getData(head); p->next=front->next; front->next=p; } printf("任意插入数据成功\n");}pLINK insertData(pLINK head){ if(head==NULL) { head=createList(head); } int select; while (1) { printf("=========\n"); printf("1.头插\n"); printf("2.尾插\n"); printf("3.任意位置插入\n"); printf("4.返回上一层\n"); printf("=========\n"); scanf("%d",&select); switch (select) { case 1: headInsert(head); break; case 2: tailInsert(head); break; case 3: randomInsert(head); break; case 4: return head; default: break; } } return head;}void tailDelete(pLINK head){ if(head==NULL||head->next==NULL) { printf("无数据可删\n"); return; } pLINK front=head; for (; front->next->next!=NULL; front=front->next) { } //front->next->next==NULL pLINK tail=front->next; front->next=NULL; free(tail); printf("尾删成功\n");}void headDelete(pLINK head){ if(head==NULL||head->next==NULL) { printf("无数据可删\n"); return; } pLINK current=head->next; head->next=current->next; free(current); printf("删除成功\n");}void randomDelete(pLINK head){ if(head==NULL||head->next==NULL) { printf("无数据可删\n"); return; } printf("请输入要删除的位置:"); int index=0; scanf("%d",&index); if(index<=0||index>getListLength(head)) { printf("输入位置有误\n"); return; } if(index==1) { headDelete(head); } else if (index==getListLength(head)) { tailDelete(head); } else { pLINK front; int i; for (front=head->next,i=1; i<index-1; front=front->next,i++) { } pLINK current=front->next; front->next=current->next; free(current); } printf("任意删除数据成功\n");}void deleteData(pLINK head){ if(head==NULL||head->next==NULL) { printf("无数据可删\n"); return; } int select; while (1) { printf("=========\n"); printf("1.头删\n"); printf("2.尾删\n"); printf("3.任意位置删除\n"); printf("4.返回上一层\n"); printf("=========\n"); scanf("%d",&select); switch (select) { case 1: headDelete(head); break; case 2: tailDelete(head); break; case 3: randomDelete(head); break; case 4: return; default: break; } }}void searchData(pLINK head){ if(head==NULL||head->next==NULL) { printf("无数据查询\n"); return; } printf("请输入要查询的学生的学号:"); int num; scanf("%d",&num); pLINK temp=head->next; for (; temp!=NULL; temp=temp->next) { if(temp->data.num==num) { printf("这个学生的信息[%d %s]\n",temp->data.num,temp->data.name); return; } } if(temp==NULL) { printf("查无此人\n"); return; }}void changeData(pLINK head){ if(head==NULL||head->next==NULL) { printf("无数据查询\n"); return; } printf("请输入要修改的学生的学号:"); int num; scanf("%d",&num); pLINK temp=head->next; for (; temp!=NULL; temp=temp->next) { if(temp->data.num==num) { printf("这个学生原信息为[%d %s]\n",temp->data.num,temp->data.name); printf("请输入要修改的信息[学号 姓名]:"); scanf("%d%s",&temp->data.num,temp->data.name); return; } } if(temp==NULL) { printf("查无此人\n"); return; }}pLINK readFileToMemory(){ pLINK head=(pLINK)malloc(sizeof(LINK)); pLINK p=head; //1.打开文件 FILE *fp=fopen(FILENAME, "r"); if(fp==NULL) { perror("fopen failed"); return NULL; } //2. int length=0; fread(&length, sizeof(int), 1, fp); int i=1; for (; i<=length; i++) { pLINK q=(pLINK)malloc(sizeof(LINK)); fread(&q->data, sizeof(Student), 1, fp); p->next=q; q->next=NULL; p=p->next; } //3 fclose(fp); return head;}void saveDataToFile(pLINK head){ if(head==NULL||head->next==NULL) { printf("无数据可保存\n"); return; } //1.打开文件 FILE *fp=fopen(FILENAME, "w"); if(fp==NULL) { perror("fopen failed"); return; } int length=getListLength(head); fwrite(&length, sizeof(int), 1, fp); //2.对文件进行写 pLINK temp=head->next; for (; temp!=NULL; temp=temp->next) { fwrite(&temp->data, sizeof(Student), 1, fp); } //3.关闭文件 fclose(fp);}int main(){ pLINK head=NULL; int select; while (1) { printf("=========\n"); printf("1.创建链表\n"); printf("2.插入数据\n"); printf("3.删除数据\n"); printf("4.打印链表\n"); printf("5.查询数据\n"); printf("6.修改数据\n"); printf("7.保存数据到文件\n"); printf("8.读取文件\n"); printf("0退出\n"); printf("=========\n"); scanf("%d",&select); switch (select) { case 1: head=createList(head); break; case 2: head=insertData(head); break; case 3: deleteData(head); break; case 4: printList(head); break; case 5: searchData(head); break; case 6: changeData(head); break; case 7: saveDataToFile(head); break; case 8: head=readFileToMemory(); break; case 0: return 0; default: break; } } return 0;}
1 0
- c语言实现链表的创建、增、删、改、查
- C语言实现对顺序表的增删改查
- C语言:链表的创建、增、删、查
- c语言-指针实现链表增删改查
- C语言实现双向链表,增删改查,排序
- C语言基本数据结构之一(线性链表的增,删,改,查及倒序)
- 【转】PostgreSQL 数据库C语言代码实现【数据库连接,创建表, 以及增删改查】
- 第一次写C语言链表的增删改查
- c语言链表的增删改查
- C语言链表,增删改查
- 用Java语言实现链表的增删改查
- 数组的增删改查的C语言实现
- C语言实现远程MySql的增删改查
- java实现单向链表的增、删、改、查
- 链表的增,删,改,查实现
- C语言实现顺序表增删查改操作
- [C#]实现对XML文件的基本操作(创建xml文件,增、删、改、查 xml节点信息)
- 单链表的应用:用C语言实现简单的员工管理系统(新建、增、删、改、查、排序)
- C#基础第十五天
- greenDao3的使用说明
- 无人机导航中常见的坐标系
- CSS基础
- 图像大小批量切分处理
- c语言实现链表的创建、增、删、改、查
- C#基础 Html入门
- Bootstrap
- C#基础第十九天 CSS样式
- 九度OJ题目1156:谁是你的潜在朋友解题报告
- ng
- 程序员的知识管理
- C# 数据库SQl语句
- Java基础复习(四)-递归练习