数据结构的学习之线性表

顺序存储结构借助高级程序语言中的数组来表示,一维数组的下标(从0开始)与元素在线性表中的序号(从1开始)一一对应。类型描述如下:

#define MaxSize 线性表可能达到的最大长度

typedef struct{

ElementType  elem[MaxSize];/*线性表占用的数组空间*/

int  listlength ;/*线性表的实际长度*/

}Seqlist;

线性表定义为 SeqList  a;第i个元素对应为a.elem[i-1]表示,a的长度由a.listlength表示。

目录

顺序表的基本运算(重点)

单链表及其基本运算


顺序表的基本运算(重点)

1.查找运算

int Locate(SeqList,ElemType e)

/*在顺序表中查找元素e,ifL.elem[i]==e,则返回元素位置,找不到返回-1*/

{  int   i=0;

while((i<=l.listlength-1)&&(l.listlength!=e))

  i++;

if(i<=l.listlenth-1)

return (i);

else return (-1);

}

2.插入运算

顺序表是以“存储位置相邻”表示元素之间的前驱和后继关系,插入第i个元素,要将后面的元素进行后移。

void InsList(Seqlist *l,int i,ElemType e)

{

if((i<0)||(i>l->listlength))

{

printf("Error");

return 0;

}

if(l->listlength>=MaxSize-1)

{

printf("Overflow");

return 0;

}

for(k=l->listlength-1;k>=i;k--)

l->elem[k+1]=l->elem[k];

l->elem[i]=e;

l->listlength++;

}

3.删除运算

数据元素前移,链表长度减一即可

void Dellist(Seqlist *l,int i)

{
  if((i<0)||(i>l->listlength-i))

{

printf("Error");

return 0;

}

for(k=i+1;i<=l->listlength-1;k++)

  l->elem[k-1]=l->elem[k];

l->listlength--;

}

ps:写一个算法使得两个递增有序顺序表合并成一个新的递增有序顺序表。

void Merge (seqlist la,seqlist lb,SeqList *lc)

{

   int i=j=k=0;

while((i<=la.listlength-1)&&(j<=lb.listlength-1))

{

    if(la.elem[i]<=lb.elem[j])

{

     lc->elem[k]=la.elem[i];

   ++k;++i;

}

else 

{

lc-elem[k]=lb.elem[j];

++k;++j;

}

}

while(i<=la.listlength-1)

{

  lc->elem[k]=la.elem[i];

++k;++i;

}/*从前往后遍历进行比较把较小的数赋给新的顺序表中*/

while(j<=lb.listlength-1)

{

lc->elem[k]=lb.elem[j];

++k;++j;

}

lc->listlength=la.listlength+lb.listlength;

}

单链表及其基本运算

由n个节点一次相连构成的链表,称为线性表的链式存储表示,又因为每个节点中只包含一个指针域,所以又称为单链表或线性链表。

typedef   struct Lnode{

 elementtype data;

strct Lnode *next;

}ListNode;

typedef ListNode *LinkList ;/*Linklist 为指向ListNode的指针类型*/

Linklist head;//头指针的声明

单链表基本运算的实现(重要)

(1)查找运算
LinkList Locate(LinkList head ,ElemType x)

{

  p=head->next;

  while(p!=NULL&&p->data!=x)

   p=p->next;

  return p;

}

(2)单链表的插入操作

申请新节点,数据域的值为x,指针指向这个新节点,并且该节点的指针域指向下一个节点。

void InsList(Linklist head,int i,ElemType x)

{

pre = head;k=0;

while(Pre!=NULL&&k<i-1)

{
pre=pre->next;

k=k+1;

}

if((k!=i-1)||(pre==NULL))

printf("Error");

else

{

  p=(LinkList)malloc(sizeof(ListNode));

  p->data=x;

  p->next=pre->next;

 pre->next=p;

}

}

(3)删除节点

void DelList (Linklist head,int i)

{

  pre=head;k=0;

while(pre->next!=NULL&&k<i-1)

{
pre=pre-next;

k=k+1;

}

if(!(pre->next)&&k<=i-1)

printf("Error");

else

{

  p=pre->next;

  pre->next=pre->next-next;

free(p);

}

}

以上三种基本运算均是在头结点的单链表上实现的。下面仅以删除操作为例,给出其在不带头节点的单链表上的实现。

Linklist DelList(Linklist head,int i)

{
  if(head==NULL)

{

printf("Empty link");

retrun (NULL);

}

if(i==1)

{

p=head;

head=head->next;

free(p);

return (head);

}

pre = head;k=0;

while(pre->next!=NULL&&K<i-1)

{

pre=pre->next;

k=k+1;

}

if(!(p->next)&&k<=i-1)

   printf("Inexistent node");

else {

p=pre->next;

pre->next=pre->next->next;

free(p);

}

return (head);

}

ps:写一算法建立带头节点的单链表

Linklist Create()

{    p=q=NULL;

    scanf(&x);

    while(x!=FLAG)

{

p=(LinkLIst)malloc(sizeof(ListNode));

p->data=x;

p->next=q;

q=p;

scanf(&x);

}

head=(Linklist)malloc(sizeof(ListNode))

head->next=p;

return (head);

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值