#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/************************类型定义************************/
typedef char datatype;
void printElem(datatype x)
{
printf("%c",x);
}
typedef struct node
{
datatype data;
struct node *next;
}LNode,*LinkList;
/**********************单链表的基本操作*********************/
//创建空的单链表 (需说明是否带头结点)
LinkList Create_Linklist()
{
LinkList H=(LNode *)malloc(sizeof(LNode));
if(H)
H->next=NULL;
return H;
}
//销毁单链表
void Destroy_Linklist(LinkList *H)
{
LinkList q,p;
p = *H;
while(p)
{
q=p;
p=p->next;
free(q);
}
*H=NULL;
}
//求表长
int Length_LinkList(LinkList H)
{
LinkList j;
int i=0;
j=H->next;
while(j)
{
i += 1;
j=j->next;
}
return i;
}
//按序号查找
LinkList Get_LinkList(LinkList H,int i)
{
LinkList p;
p=H->next;
int ret=Length_LinkList(H);
if(i<=ret)
for(int j=1;j<=ret;j++)
{
if(j==i)
return p;
else
p=p->next;
}
else
return NULL;
}
//按值查找
LinkList Get_LinkList(LinkList H,datatype x)
{
LinkList p;
p=H->next;
int ret=Length_LinkList(H);
for(int i=0;i<ret;i++)
{
if(p->data==x)
return p;
else
p=p->next;
}
}
//插入
int Insert_LinkList(LinkList H,int i,datatype x)
{
LNode *p;
if(i==1)
{
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=x;
H->next=s;
s->next=NULL;
}
else
{
p = Get_LinkList(H,i-1);
if(p==NULL)
{
printf("插入的位置错误!");
return 0;
}
else
{
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=p->next;
p->next=s;
return 1;
}
}
}
//删除(按序号)
int Delete_LinkList(LinkList H,int i)
{
LNode *p,*s;
p = Get_LinkList(H,i-1);
if(p==NULL)
{
printf("第%d个结点不存在!",i-1);
return -1;
}
else if(p->next=NULL)
{
printf("第%d个结点不存在!",i);
return 0;
}
else
{
s=p->next;
p->next=s->next;
free(s);
return 1;
}
}
//删除(按值)
int Delete_LinkList(LinkList H,datatype x)
{
LNode *p,*s;
p = Get_LinkList(H,x);
int ret=Length_LinkList(H);
s=H;
for(int i=1;i<=ret;i++)
{
if(s->next==p)
s->next=p->next;
else
s=s->next;
}
free(p);
return 1;
}
/*******************程序的功能函数**************************/
//打印单链表(带头结点)
void Print(LinkList H)
{
printf("head:");
LinkList p=H->next;
while(p)
{
printf("-->");
printElem(p->data);
p = p->next;
}
printf("\n");
}
//查找(按值或按序号查找,用户可选择任意一种方式)
void Search(LinkList H)
{
int choice,i;
char x;
LNode *p,*s;
printf("请选择按值查找or按序号查找(1 or 2):");
scanf("%d",&choice);
if(choice==1)
{
printf("请输入将要查找的值:");
scanf("%s",&x);
p=Get_LinkList(H,x);
s=H->next;
int ret=Length_LinkList(H);
for(int i=1;i<=ret;i++)
{
if(s==p)
printf("该值位于第%d个位置\n",i);
else
s=s->next;
}
}
else if(choice==2)
{
printf("请输入序号:");
scanf("%d",&i);
p=Get_LinkList(H,i);
printf("值为:%d",p->data);
}
else
printf("输入错误!");
}
//插入
void Insert(LinkList H)
{
int i,p;
char x;
printf("请输入将要插入的值及其位置:");
scanf("%s %d",&x,&i);
p=Insert_LinkList(H,i,x);
if(p)
printf("插入成功!");
else
printf("插入失败!");
}
//删除 (按值或按序号删除,用户可选择任意一种方式)
void Delete(LinkList H)
{
int choice,i,p;
char x;
printf("请选择按值删除or按序号删除(1 or 2):");
scanf("%d",&choice);
if(choice==1)
{
printf("请输入将要删除的值:");
scanf("%s",&x);
p=Delete_LinkList(H,x);
if(p)
printf("删除成功!");
}
else if(choice==2)
{
printf("请输入将要删除的序号:");
scanf("%d",&i);
p=Delete_LinkList(H,i);
if(p)
printf("删除成功!");
}
else
printf("输入有误!");
}
/*******************main函数**************************/
void printChoice()
{
printf("\n请选择功能:\n");
printf("\t1.打印\n");
printf("\t2.查找\n");
printf("\t3.插入\n");
printf("\t4.删除\n");
printf("\t5.退出程序\n");
printf("请选择:");
}
int main()
{
LinkList H=Create_Linklist();
if(!H)
{
printf("空间分配失败!");
return 0;
}
int choice=-1;
while(1)
{
printChoice();
scanf("%d",&choice);
switch(choice)
{
case 1:
Print(H);
break;
case 2:
Search(H);
break;
case 3:
Insert(H);
break;
case 4:
Delete(H);
break;
default:
printf("程序结束!\n");
break;
}
if(choice==5)
break;
}
}
程序改为这个后,可以插入,按值查找正常,但按序号查找和按序号删除均不正常 |