单链表的实现实现单链表的基本操作,必须包括初始化链表(元素为空)、销毁链表、求表长、查找、插入、删除、遍历(打印)等操作。
请编写程序,实现上述单链表的基本操作。
注意:1.元素类型可以自定义2.可以是带头结点的单链表或不带头结点的单链表#include<stdio.h>#include<stdlib.h>#include<string.h>typedef int datatype;typedef struct node{datatype data;struct node *next;}LNode,*LinkList;/*//创建不带头结点的单链表Linklist Create_LinkList(){return NULL;}*///创建带头结点的单链表LinkList Create_LinkList(){LinkList L=NULL;L=(LinkList)malloc(sizeof(LNode));if(L)L->next=NULL;return L;}//打印单链表void Print_LinkList(LinkList H){if(H == NULL){printf("\n");}else{printf("head-->");LinkList p=H->next;while(p!=NULL){printf("%d",p->data);printf("-->");p=p->next;}printf("\n");}}//销毁单链表void Destroy_LinkList(LinkList *H) {LinkList p, q;p = *H;while(p){q = p;p = p->next;free(q);}*H = NULL;if(*H==NULL)printf("销毁成功,请退出\n");elseprintf("销毁失败\n");}//求表长int Length_LinkList(LinkList L){LNode *p=L;int j=0;while(p->next){p=p->next;j++;}return j;}//表长功能实现void length(LinkList L){int i=0;i=Length_LinkList(L);printf("表长:%d\n",i);}//查找操作//1)按序号查找LNode * Get_LinkList1(LinkList L,int i) {LNode *p=L;int j=0;while(p->next!=NULL&&j<i){p=p->next;j++;}if(j==i)return p;elsereturn NULL;}//2)按值查找即定位int Locate_LinkList2(LinkList L,datatype x){LNode *p=L;int i=0;while(p->data!=x){p=p->next;i++;}return i;}//查找功能实现void find(LinkList L){int i,n;LNode *p,*s;datatype x;printf("选择下列功能\n");printf("\t1)按序号查找\n");printf("\t2)按值查找即定位\n");scanf("%d",&i);switch(i){case 1:printf("请输入第几个元素:");scanf("%d",&n);p=Get_LinkList1(L,n);if(p==NULL)printf("查找失败\n");elseprintf("您所查找的元素为:%d\n",p->data);break;case 2:printf("请输入元素值:");scanf("%d",&x);i=Locate_LinkList2(L,x);if(i!=0)printf("第%d个元素\n",i);elseprintf("查找失败\n");break;}}//插入int Insert_LinkList(LinkList L,int i,datatype x) {LNode *p,*s;p=Get_LinkList1(L,i-1);if(p==NULL){printf("参数i错\n");return 0;}else{s=(LNode *)malloc(sizeof(LNode));s->data=x;s->next=p->next;p->next=s;}return 1;}//插入功能实现void Insert(LinkList L){LNode *p=L;datatype x;int i,a=1;printf("请输入要插入的数:");scanf("%d",&x);printf("请输入要插入的位置:");scanf("%d",&i);a=Insert_LinkList(L,i,x);if(a==1)printf("插入成功\n");elseprintf("插入失败\n");}//删除int Del_LinkList(LinkList L,int i){LinkList p,s;p=Get_LinkList1(L,i-1);if(p==NULL){printf("第i-1个结点不存在\n");return -1;}else{if(p->next==NULL){printf("第i个结点不存在\n");return 0;}else{s=p->next;p->next=s->next;free(s);return 1;}}}//删除功能实现void del(LinkList L){datatype x;int i,j,n,k;LNode *p;printf("选择下列功能\n");printf("\t1)按序号删除\n");printf("\t2)按元素值删除\n");scanf("%d",&i);switch(i){case 1:printf("请输入第几个元素:");scanf("%d",&n);k=Del_LinkList(L,n);if(k!=1)printf("删除失败\n");elseprintf("删除成功\n");break;case 2:printf("请输入元素值:");scanf("%d",&x);i=Locate_LinkList2(L,x);j=Del_LinkList(L,i);if(j!=1)printf("删除失败\n");elseprintf("删除成功\n");break;}}//初始化链表(元素为空)、销毁链表、求表长、查找、插入、删除、遍历(打印)等操作//main函数void printChoice(){printf("\n请选择功能:\n");printf("\t1.表长\n");printf("\t2.查找\n");printf("\t3.插入\n");printf("\t4.删除\n");printf("\t5.打印\n");printf("\t6.销毁链表\n");}int main(){LinkList L=Create_LinkList();int choice=-1;while(1){printChoice();scanf("%d",&choice);switch(choice){case 1:length(L);break;case 2:find(L);break;case 3:Insert(L);break;case 4:del(L);break;case 5:Print_LinkList(L);break;case 6:Destroy_LinkList(&L);break;default:printf("输入错误");break;}}}。