考研数据结构—线性表

走出失恋的最好办法就是开始一项新的工程并全力以赴。

线性表:具有相同数据类型的数据元素的有限序列。

1定义

/*静态定义*/
#define Maxsize 100  // to define a SqList's length statically
typedef int Elemtype  
typedef struct{
    Elemtype data[Maxsize];
    int length;   //current Sqlist length 
}SqList;

/*动态定义*/
#define InitSize 100   //初始长度
typedef int Elemtype
typedef struct{
    Elemtype *data;
    int Maxsize,length;
}SqList;

SqList L;

L.data = (Elemtype*)malloc(sizeof(Elemtype)*InitSize);  //malloc 是C中的动态分配函数

2基本操作

/*顺序表插入

插入包括三个动作:
1 返回值是bool 参数有三个分别为(待插顺序表,插入位置,插入数据)
2 合法性判断 判断插入位置在不在中  判断表满没满,还能不能插入
3 插入元素,当前表长加1,从插入位置开始把所有元素向后移动一位

*/
bool ListInsert(SqList &L, int i,Elemtype e){
    if (i<0||i>L.length+1)  //待插入位置是否正确
        return false;
    if (L.length>=Maxsize)    //当前表长是否已满
        return false;
    for(int j=L.length; j>=i ;j--)
    {
        L.data[j]=L.data[j-1];
    }
        L.data[i-1] = e;
        L.length++;
        return true;
}
/*顺序表删除

1 返回类型是booL  参数也是三个(表,位置,被删元素)
2 判断合法性  表里有没有元素,表里有没有你指定的要删除的位置
3 所删元素赋值给e,所有元素前移一位

*/

bool ListDelete(SqList &L,int i, Elemtype &e)
{
    if(i<0||i>L.length+1)
        return false;
    if(L.length<1)
        reture false;
    e = L.data[i-1];
    for (int j=i;j<L.length;j++)
        L.data[j-1]=L.data[j];
    L.length--;
    return true;   
}
/*顺序表的查找



*/


int LocateElement(SqList L,Elemtype e) //由于不用修改表,所以没有&
{

    int i;

    for(i=0;i<L.length;i++)
    {
        if(L.data[i]==e)
            return i+1;
    }
    return 0;
}

巩固例题:

/*从顺序表中删除具有最小值的元素(假设唯一),并由函数返回被删除元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错误信息并退出运行。*/

bool ListDele(SqList &L,Elemtype &e)
{
    if(L.length<1)
        return false;
    e = L.data[0];
    int pos=0;
    for (i=1;i<L.length;i++)
    {
        if(L.data[i]<e)
            e = L.data[i];
            pos = i;
    }
    L.data[pos]=L.data[L.length-1];  //注意是最后一个元素是length-1
    L.length--;                    //注意删除后当前长度要减1
    return true;
}
    
/*将顺序表的所有元素逆置*/
void Reserve(SqList &L)
{
    Elemtype temp;
    for (int i=0;i<L.length;i++)
    {
        temp = L.data[0];
        L.data[i] = L.data[L.length-i-1];
        L.data[L.length-i-1]=temp;
    }
}

单链表

/*链表结点定义*/

typedef struct LNode{
    Elemtype data;
    struct LNode *next;
}LNode,*LinkLinst;
/*单链表定义头插法*/

typedef struct LNode{
    Elemtype data;
    struct LNode *next;
}LNode,*LinkList;

LinkList CreatLinkList(LinkList &L){      //头指针
    LNode *s;                            //指向新结点的指针
    int x;                               //新结点的数据
    L = (LinkList)malloc(sizeof(LNode)); //创建头结点,令头指针指向头结点
    L->next = NULL;                      //令成空表
    scanf("%d",&x);                      //输入要插入的值
    while(x!=9999){                      //插入
        s = (LinkList)malloc(sizeof(LNOde));//开辟新结点的地方
        s->data = x;                     //新结点数据值为x
        s->next = L->next;               //新结点后继指向头指针的后继(头插法)
        L->next = s;                      //头结点后继为新结点
        scanf("%d",&x);                    //下一个要插入的结点
    }
    return L;
}
/*单链表定义之尾插法*/

typedef struct LNode{
    Elemtype data;
    struct LNode *next;
}LNode,*LinkList;

LinkList CreatLinkList(LinkList &L){
    LNOde *s,*r=L; 
    int x;
    L = (LinkList)malloc(sizeof(LNode));
  
    scanf("%d",&x);
    while(x!=9999){
        s = (LinkList)malloc(sizeof(LNode));
        s->data = x;
        r->next = s;
        r = s;
        scanf("%d",&x);
   }
   r->next = NULL;
   return L;
}
/*按序号查找结点值*/
LNode *GetElem(LinkList L,int i){  //注意,返回值类型是LNode*
    int j=1;
    LNode *p = L->next;
    if(i==0) return L;
    if(i<1) return NULL;
    while(p&&j<i){
        p = p->next;
        j++;
    }
    return p;
}
/*按值查找结点*/
LNode *LocateElem(LinkList L,Elemtype e){
    LNode *p = L->next;
    while(p!=NULL&&p->data!=e){
        p = p->next;
    }
    return p;
}

小结:

建表两种方式:头插法 尾插法

表的插入:
表的删除:

查找 :按值查找,按位查找

双链表的出现是为了方便找前驱

循环链表的出现是为了能从任意位置遍历链表

typedef struct LNode{
    Elemtype data;
    struct LNode *next;
}LNode,*LinkList;

LinkList CreatLinkList(LinkList &L){
    LNode *s;
    L = ()malloc();   x
    L->next = NULL;
    scanf("%d",&e);
    while(x!=9999){
        s =()malloc();  x
        s->data = e;
        s->next = L->next;
        L-next = s;        x
        L.length++;
        scanf("%d",&e);
    }
    return L;
}


LinkList CreatLinkList(LinkList &L){
    LNode *s,*r = L;
    int x;
    scanf("%d",&x);
    while(x!=9999){
        s = ()malloc();
        s->data = x;
        r->next = s;
        r = s;
        scanf("%d",&x);
    }
    r->next = NULL;
    return L;
}

LNode *GetElem(LinkLIst &L,int i){
    int j=1;
    LNode *p = L->next;b
    if(i==1) return L;
    if(i<1||i>L.length) return Null;
    while(i<j){
        p = p->next;
        j++;
    }
    return p;
}

LNode *LocateElem(L &L,Elem e){
    LNode *p = L->next;
    for(int i=1;i<L.length;i++)
        if(L.data[i]==e)
            return i+1;
    return 0;
}

p = GetElem(L,i-1);
s->next = p->next;
p->next = s;



    

后面文章还有线性表的练习题,需要的朋友可以查阅,加油!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纸城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值