您的位置:首页 > 其它

单链表的基本操作(查找,插入,删除)

2016-09-25 17:11 716 查看
这周老师给的作业跟上周貌似差不多。只是用了单链表。

[align=left]完成单链表的基本操作函数。[/align]
[align=left]1) 初始化单链表[/align]
2) 给定的数据元素存放在一维数组中,分别完成头插法和尾插法建立单链表
[align=left]3) 将数据元素从键盘依次输入,分别完成头插法和尾插法建立单链表[/align]
[align=left]4) 输出单链表的长度[/align]
[align=left]5) 实现按位查找和按值查找[/align]
[align=left]6) 实现插入和删除操作[/align]
[align=left]7) 实现遍历单链表操作[/align]

#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.贴上来的代码空格有点小奇怪啊。不用应该没什么太大影响。= =处女座强迫症伤不起 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐