就地逆转单链表和在单链表结构上实现线性表操作Locate(L,x)

#include <iostream>
using namespace std;
#include <malloc.h>
#include <stdio.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define IINFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 10
#define LISTINCREAMENT 2

typedef int ElemType;
typedef int Status;

typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;
void CreateList_L(LinkList &L,int n){
    //逆位序输入n个元素的值,建立带头结点的单链表L
    int i;
    LinkList p;
    L=(LinkList)malloc(sizeof(LNode));
    L->next = NULL;//先建立一个带头结点的单链表
    for(i = n;i>0;--i){
        p = (LinkList)malloc(sizeof(LNode));    //生成新结点
        scanf("%d",&p->data); //插入元素值
        p->next = L->next;
        L->next = p;//插入到表头
    }//CreateList_L

}
void PrintList_L(LinkList L){
    //打印输出链表元素的值
    LinkList p=L->next;
    while(p)
    {
        printf("%d ",p->data);
        p = p->next;
    }
     printf("\n");
}//PrintList_L
Status GetElem_L(LinkList L,int i,ElemType &e){
    //L为带头结点的单链表的头指针
    //当第i个元素存在时,其赋值给e并返回OK,否则返回ERROR
    LinkList p;
    p=L->next;
    int j=1;    //初始化,p指向第一个结点,j为计数器
    while(p&&j<i){
        //顺时针向后查找,直到P指向第i个元素或p为空
        p=p->next;
        ++j;
    }
    if(!p||j>i)
        return ERROR;   //第i个元素不存在
    e=p->data;  //取第i个元素
    return OK;
}//GetElem_L

Status LinkInsert_L(LinkList &L,int i,ElemType e){
    //在带头结点的单链线性表L中第i个位置之前插入元素e
    LinkList p;
    LinkList s;
    p=L;
    int j=0;
    while(p&&j<i-1){    //寻找第i-1个结点
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)//i小于1或者大于表长加1
        return ERROR;
        s=(LinkList)malloc(sizeof(LNode));  //生成新结点
        s->data=e;
        s->next=p->next;    //插入L中
        p->next=s;
        return OK;
}//LinkInsert_L
Status LinkDelete_L(LinkList &L,int i,ElemType &e){
    //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
    LinkList p;
    LinkList q;
    p=L;
    int j=0;
    while(p->next&&j<i-1){  //寻找第i个结点,并令p指向其前驱
        p=p->next;
        ++j;
    }
    if(!(p->next)||j>i-1)
        return ERROR;   //删除位置不合理
    q=p->next;
    p->next=q->next;    //删除并释放结点
    e=q->data;
    free(q);
}//LinkDelete_L
Status ConverseList(LinkList &L)
{
    LinkList p,q,r;
    p=L->next;//p指向第一个结点
    q=p->next;//q指向第二个结点
    p->next=NULL;//并将p作为尾结点
    while(q)
    {
        r=q->next;//r指向q的下一个结点
        q->next=p;//并将p赋值给q->next
        p=q;
        q=r;//进行右移操作
    }
    L->next=p;
    return OK;

}
int LocateElem(LinkList L,ElemType x)
{
    int i=0;
    LinkList p=L;
    while(p&&p->data!=x)
    {
        p=p->next;
        i++;
    }
    if(!p)
        return 0;
    else
        return i;
}
int main()
{
    struct LNode;
    ElemType e;
    LinkList L;
    int i,n,t,a,b,x;

    printf("请输入链表中最开始的数据个数\n");
    scanf("%d",&n);
    printf("请输入链表中最开始的数据\n");
    CreateList_L(L,n);
    printf("目前表中元素为:\n");
    PrintList_L(L);


    printf("请输入需要插入元素的位置:");
    scanf("%d",&i);
    printf("请输入需要插入元素的的值:");
    scanf("%d",&e);
    t=LinkInsert_L(L,i,e);
    if(t==OK)
    {
        printf("插入成功!");
        printf("插入成功后的链表中元素为:\n");
        PrintList_L(L);
    }
    else
    {
    printf("插入失败!");
    }


    printf("请输入需要得到指定元素的位置:\n");
    scanf("%d",&i);
    a=GetElem_L(L, i,e);
    if(a==OK)
    {
        printf("得到成功!");
        printf("得到成功后的元素为%d\n",e);

    }
    else
    {
    printf("得到失败!");
    }

    printf("请输入需要删除元素的位置:\n");
    scanf("%d",&i);
    b=LinkDelete_L(L,i,e);
    if(b==OK)
    {
        printf("删除成功!");
        printf("删除的元素为%d\n",e);
        printf("删除成功后的链表元素为:\n");
        PrintList_L(L);
    }
    else
    {
    printf("删除失败!\n");
    }
    printf("就地转置单链表:\n");
    ConverseList(L);
    PrintList_L(L);
     printf("请输入需要查找的元素:\n");
     scanf("%d",&x);
    LocateElem(L,x);
    printf("查找的元素在第%d个位置",i);
    return 0;
}

就地逆转详细解答

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值