单链表的基本操作(查找,插入,删除)
这周老师给的作业跟上周貌似差不多。只是用了单链表。
完成单链表的基本操作函数。
1) 初始化单链表
2) 给定的数据元素存放在一维数组中,分别完成头插法和尾插法建立单链表
3) 将数据元素从键盘依次输入,分别完成头插法和尾插法建立单链表
4) 输出单链表的长度
5) 实现按位查找和按值查找
6) 实现插入和删除操作
7) 实现遍历单链表操作
#include <cstdio> #include <cstring> #include <cstdlib> //查找1.内容2.序号 //插入 //删除 typedef struct student { int num; char name[10]; }STU; typedef struct Node { STU data; struct Node * next; }Node; void denglu(Node *L);//登录函数 void chazhao(Node *L);//查找函数 void Printf(Node *L);//输出函数 void CreateFromHead(Node *L);//头插法 void CreateFormTail(Node *L);//尾插法 void panduan(Node *L);//判断头插还是尾插 void Get(Node *L);//按序号结点查找 void Locate(Node *L);//按内容查找(值) void Inslist(Node *L);//插入 void Dellist(Node *L);//删除 void Dellist(Node *L)//删除 { system("CLS"); int n; printf("请输入要删除的结点\n"); scanf("%d",&n); if(n<=0){ printf("输入的数据不合法,请重新输入\n"); Dellist(L); } Node *pre,*r; int k=0; pre=L; while(pre->next !=NULL&&k<n-1){ pre=pre->next; k=k+1; } if(pre->next==NULL){ printf("没有找到该结点,请重新输入\n"); Dellist(L); } r=pre->next; pre->next=r->next; free(r); printf("删除成功!\n"); denglu(L); } void Inslist(Node *L)//插入 { system("CLS"); int n; printf("请输入在第几个位置插入数据\n"); scanf("%d",&n); printf("请输入插入的学号,姓名\n"); int num1; char name1[10]; scanf("%d %s",&num1,name1); Node *pre,*s; int k=0; if(n<=0){ printf("输入的数据不合法,请重新输入\n"); Inslist(L); } pre=L; while(pre!=NULL&&k<n-1){ pre=pre->next; k=k+1; } if(pre==NULL){ printf("无法找到该节点,请重新输入\n"); Inslist(L); } s=(Node*)malloc(sizeof(Node)); strcpy(s->data .name ,name1); s->data.num=num1; s->next =pre->next ; pre->next =s; printf("插入成功!\n"); denglu(L); } void Locate(Node *L)//按内容查找(值) { system("CLS"); int n; printf("请输入要查找的学号\n"); scanf("%d",&n); Node *p; p=L->next; while(p!=NULL){ if(p->data.num!=n){ p=p->next; }else break; } printf("你要查找的学号所对应的信息为%d %s\n",p->data.num,p->data.name); denglu(L); } void Get(Node *L)//按序号结点查找 { system("CLS"); int n; printf("请输入你要查找的结点\n"); scanf("%d",&n); if(n<=0){ printf("输入的数据不合法,请重新输入\n"); Get(L); } Node *p; p=L; int j=0; while((p->next!=NULL)&&(j<n)){ p=p->next; j++; } if(n==j){ printf("你要查找的结点的储存位置的数据为%d %s\n",p->data.num,p->data.name); } denglu(L); } void Printf(Node *L) { int q=0; Node *p=L->next; while(p!=NULL) { q++; printf("%d %s\n",p->data.num,p->data.name); p=p->next; } printf("单链表长度为%d\n",q); denglu(L); } void chazhao(Node *L) { printf("1.按序号查找\n"); printf("2.按内容查找\n"); printf("3.返回主界面\n"); int aa; scanf("%d",&aa); switch(aa){ case 1:Get(L); case 2:Locate(L); case 3:denglu(L);break; default: printf("输入错误请重新输入\n"); chazhao(L); } } void denglu(Node *L) { int a; printf("请选择你要做什么\n"); printf("1.查找\n"); printf("2.插入\n"); printf("3.删除\n"); printf("4.打印现有的学生信息及单链表长度\n"); printf("5.退出\n"); scanf("%d",&a); switch(a){ case 1:chazhao(L); case 2:Inslist(L); case 3:Dellist(L); case 4:Printf(L); case 5:printf("谢谢使用\n");exit(0); default: printf("输入错误请重新输入\n"); denglu(L); } } void CreateFromHead(Node *L)//头插法 { Node *s; int n;//n为元素个数 printf("请输入元素个数\n"); scanf("%d",&n); printf("请输入学号姓名\n"); for(int i=1;i<=n;i++) { s=(Node *)malloc(sizeof(Node)); scanf("%d %s",&s->data.num,s->data.name); s->next=L->next; L->next=s; } } void CreateFormTail(Node *L)//尾插法 { Node *s,*r; r=L; int n;//n为元素个数 printf("请输入元素个数\n"); scanf("%d",&n); printf("请输入学号姓名\n"); for(int i=1;i<=n;i++) { s=(Node *)malloc(sizeof(Node)); scanf("%d %s",&s->data.num,s->data.name); r->next=s; r=s; if(i==n){ r->next=NULL; } } } Node *InitList(Node *L)//初始化单链表 { L=(Node *)malloc(sizeof(Node)); L->next=NULL; return L; } void panduan(Node *L) { int q; printf("请选择用哪种方式建立链表\n"); printf("1.头插法\n"); printf("2.尾插法\n"); scanf("%d",&q); switch(q){ case (1): CreateFromHead(L); printf("输入成功!\n"); break; case (2): CreateFormTail(L); printf("输入成功!\n"); break; default: printf("输入错误请重新输入\n"); panduan(L); } } int main() { Node *L=NULL; L=InitList(L); panduan(L); denglu(L); return 0; }
ps.贴上来的代码空格有点小奇怪啊。不用应该没什么太大影响。= =处女座强迫症伤不起 。