|

楼主 |
发表于 2018-3-25 18:18:49
|
显示全部楼层
- #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;
- }
- }
复制代码
程序改为这个后,可以插入,按值查找正常,但按序号查找和按序号删除均不正常 |
|