单链表的基本操作

#include<cstdio>
 #include<cstdlib>
 #include<cstring>
 #include<cmath>
 #include<iostream>
 using namespace std;
 #define Status int
 #define ElemType int
 //单链表结点数据结构
 typedef struct LNode
 {
 ElemType data;//数据域
 struct LNode *next;//指针域
 }LNode,*LinkList;
 //**************************基本操作函数***************************//
 //初始化函数
 Status InitList(LinkList &L)
 {
 L = new LNode;//生成头结点 这样删除等操作就不必分第一个结点和其他了
 L->next = NULL;
 return 1;
 }
 //获取单链表长度 头结点无数据,不算
 int ListLength(LinkList L)
 {
     LinkList p=L;int sum=0;
	 while(p)
	 {
	 sum++;
	 p=p->next;
	 }
     return sum;//去除头结点
 }
 //哪种插入法????
 bool ListInsert(LinkList &L,int i,ElemType e)
 {
 LNode* s;LinkList p=L;int j=0;
 while(p&&(j<i-1))//j 指到 i-1 位置或者 p 已经到最后时跳出
 {
 p=p->next;
 ++j;
 }
 if(!p||j>i-1)//i<1 或者 i>ListLength(L)+1 时,插入位置无效 不调用 ListLength,提高效率
 {
 printf("插入位置无效!!!\n");
 return false;
 }
 s=new LNode;
 s->data=e;
 s->next=p->next;
 p->next=s;
 return true;
 }
 bool ListInsert2(LinkList &L,int i,ElemType e)
 {
 LNode* s;LinkList p=L;int j=0;
 while(p&&(j<i-1))//j 指到 i-1 位置或者 p 已经到最后时跳出
 {
 p=p->next;
 ++j;
 }
 if(!p||j>i-1)//i<1 或者 i>ListLength(L)+1 时,插入位置无效 不调用 ListLength,提高效率
 {
 printf("插入位置无效!!!\n");
 return false;
 }
 s=new LNode;
 s->data=e;
 s->next=L->next;
 L->next=s;
 return true;
 }
 //删除函数 删除位置 i 的结点 即删除 i-1 之后的结点
 bool ListDelete(LinkList &L,int i)
 {
 LNode* s;LinkList p=L;int j=0;
 LinkList q;
 while(p&&(j<i-1))//j 指到 i-1 位置
 {
 p=p->next;
 ++j;
 }
 if(!(p->next)||j>i-1)//i<1 或者 i>ListLength(L)时,删除位置无效
 {
 printf("删除位置无效!!!\n");
 return false;
 }
 q=p->next;
 p->next=q->next;
 free(q);//释放空间
 return true;
 }
 //查找函数 按值查找 查找第一个等于 e 的结点 成功返回该结点指针,否则返回 NULL
 LNode *LocateElem(LinkList L,ElemType e)
 {
    LNode *p=L;
 while(p&&(p->data!=e))
 {
    p=p->next;
 }
    return p;
 }
 
 void createList(LNode *&L,int a[],int n){
	int i;
	LNode *p,*r;
	L = (LNode *)malloc(sizeof(LNode));
	L->next = NULL;//L为头结点
	r = L; 
	for(i = 0; i < n; ++i){
		p = (LNode *)malloc(sizeof(LNode));
		p->data = a[i];
		p->next = NULL;
		r->next=p;
		r=p;  
	}
	r->next = NULL;
} 
void toString(LNode *L){
	LNode *p = L->next;while(p != NULL){
		printf("%d\n",p->data);
		p = p->next;
	}
}

void swap(LNode *m,LNode *n)
 {
 	 int t;
 	 t=m->data;
 	 m->data=n->data;
 	 n->data=t;
 }
//void change(LNode *L)
//{
//
//	LNode *p=L;
//	while(p->next!=NULL){
//		p=p->next; 
//	}
//	LinkList q;
//	q=p->next;
//	q->next=L;
//	free(q);
//	L->next=NULL;

//}
 //**************************功能实现函数**************************//
 //遍历输出函数
 void PrintList(LinkList L)
 {
 LinkList p=L->next;//跳过头结点
 if(ListLength(L))
 {
 printf("当前单链表所有元素:");
 while(p)
 {
 printf("%d ",p->data);
 p=p->next;
 }
 printf("\n");
 }
 else
 {
 printf("当前单链表已空!\n");
 }
 }
 
 //插入功能函数 调用 ListInsert 插入
 void Insert(LinkList &L)
 {
 int place;ElemType e;bool flag;
 printf("请输入要插入的位置(从 1 开始)及元素:\n");
 scanf("%d%d",&place,&e);
 flag=ListInsert(L,place,e);
 if(flag)
 {
 printf("插入成功!!!\n");
 PrintList(L);
 }
 }
 void Insert2(LinkList &L)
 {
 int place;ElemType e;bool flag;
 printf("请输入要插入的位置(从 1 开始)及元素:\n");
 scanf("%d%d",&place,&e);
 flag=ListInsert2(L,place,e);
 if(flag)
 {
 printf("插入成功!!!\n");
 PrintList(L);
 }
 }
 
 //删除功能函数 调用 ListDelete 删除
 void Delete(LinkList L)
 {
 int place;bool flag;
 printf("请输入要删除的位置(从 1 开始):\n");
 scanf("%d",&place);
 flag=ListDelete(L,place);
 if(flag)
 {
 printf("删除成功!!!\n");
 PrintList(L);
 }
 }
 
 //查找功能函数 调用 LocateElem 查找
 void Search(LinkList L)
 {
	 ElemType n;LNode *q;
	 printf("请输入要查找的值:\n");
	 scanf("%d",&n);
	 q=LocateElem(L,n);
 if(q)
 {
     printf("找到该元素!\n");
 }
 else
     printf("未找到该元素!\n");
 }
 
 //逆序输出节点函数


void inversionList(LNode *L){
	if(L!=NULL){
		inversionList(L->next);
		printf("%d\n",L->data);
	}		
}



//统计节点 
void getnum(LinkList L)
 {
 int flag;
 flag=ListLength(L);
 if(flag)
 {
    printf("%d\n",flag-1);

 }
 }
 


 //菜单
 void menu()
 {
 printf("********1.插入      2.删除*********\n");
 printf("********3.查找      4.输出*********\n");
 printf("********5.插入      6.逆序输出*********\n");
 printf("********7.头变尾  8.统计节点*******\n");
 printf("********9.退出\n");
 }
 
 void qsort(LinkList L)
 {
    LinkList p=L->next;
    LinkList q=p->next;
    while(q!=NULL)
    {
    	L->data=q->data;
    	while(p!=q)
    	{
    		if(p->data<=L->data)p=p->next;
    		else{
    			swap(p,q);
    			p=p->next;
			}
		}
		q=q->next;
		p=L->next;
	}
	PrintList(L);
	
 }
  //主函数
 int main()
 {
 LinkList L;int choice;
 InitList(L);
 while(1)
 {
 menu();
 printf("请输入菜单序号:\n");
 scanf("%d",&choice);
 if(choice==8) break;
 switch(choice)
 {
 case 1:Insert(L);break;
 case 2:Delete(L);break;
 case 3:Search(L);break;
 case 4:PrintList(L);break;
 case 5:Insert2(L);break;
 case 6:inversionList(L);break;
 case 7:getnum(L);break;
 default:printf("输入错误!!!\n");
 }
 }
 return 0;
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值