程序定义一个完整的线性表,实现 插入和删除的算法?

程序定义一个完整的线性表,实现 插入和删除的算法?,第1张

#include<stdio.h>

#include<stdlib.h>

#define MAXSIZE 100

typedef struct{

int data[MAXSIZE]

int length

}SeqList

//初始化

SeqList InitList(){

SeqList L

L.length=0

return L

}

//插入元素

SeqList Insert(SeqList &L,int x){

if(L.length==MAXSIZE){

printf("表满")

exit(0)

}

L.length++

L.data[L.length]=x

return L

}

//删除第i个元素

SeqList Delete(SeqList &L,int i){

if(i<1||i>L.length){

printf("不存在第%d个元素",i)

exit(0)

}

int j

for(j=ij<=L.length-1j++){

L.data[j]=L.data[j+1]

}

L.length--

return L

}

//定位某个元素

int locate(SeqList L,int x){

int i

i=1

while(i<=L.length&&L.data[i]!=x){

i++

}

if(i<=L.length)

return i

else

return 0

}

SeqList Bingji(SeqList La,SeqList Lb,SeqList Lc){

int i,j

for(i=1i<=La.lengthi++){

for(j=1j<=La.lengthj++){

if(La.data[i]==Lb.data[j]){

Lc=Insert(Lc,La.data[i])

}

}

}

return Lc

}

//打印数组

void Display(SeqList L){

int i

for(i=1i<=L.lengthi++){

printf(" %d ",L.data[i])

}

printf("\n")

}

这个是基于数组的线性表,有插入和删除的 *** 作,如有不懂可追问。

Insert就是将一个新元素插入线性表,使得插入后的结果有序

InsertFront就是将一个新元素插在线性表的最前面

InsertRear就是将一个新元素插在线性表的最后面

DeleteFront就是将线性表的最前面的元素删除

ClearList就是清空线性表

TraverseList就是将线性表从头到尾输出一遍

(1)InitList(La)

Int a[]={100,26,57,34,79}

For (i=0i<5i++) Insert(La,a[i])

分析:for进行了5次循环,线性表分别为:

100

26,100

26,57,100

26,34,57,100

26,34,57,79,100

(2)DeleteFront(La)

InsertRear(La, DeleteFront(La))

TraverseList(La)

分析:DeleteFront执行后线性表为:

34,57,79,100

InsertRear(La, DeleteFront(La))分两步执行,先执行DeleteFront,并将删除的元素作为新元素插入到线性表的最后,过程为:

57,79,100

57,79,100,34

(3)ClearList(La)

For (i=0i<5i++)

InsertFront(La,a[i])

分析:清空线性表,再将元素依次插入线性表的最前面:

空表

100

26,100

57,26,100

34,57,26,100

79,34,57,26,100

#include<iostream>

using

namespace

std

struct

Linklist

{

int

data

Linklist

*next

}

Linklist

*L,*rear

void

create()//尾插法建立链表

{

Linklist

*p

int

x

cout<<"输入链表元素(按升序顺序输入):"

while(cin>>x&&x!=0)

{

if(L==NULL)

{

L=new

Linklist

L->data=x

rear=L

L->next=NULL

}

else

{

p=new

Linklist

p->data=x

rear->next=p

p->next=NULL

rear=p

}

}

rear->next=NULL

}

void

del(int

x)//删除data域值为x的结点

{

Linklist

*p,*k,*t

k=p=L

while(p!=NULL)

{

if(p->data==x)

break

k=p

p=p->next

}

if(p==L)

{

p=L

L=L->next

delete

p

}

else

if(p==rear)

{

k->next=NULL

delete

p

}

else

if(p==NULL)

{

cout<<"没有值为"<<x<<"的结点

"<<endl

}

else

{

k->next=p->next

delete

p

}

}

void

insert(int

x)//插入data域值为x的结点(默认原链表为升序排列)

{

Linklist

*s,*p,*k

s=new

Linklist

s->data=x

s->next=NULL

k=p=L

while(p!=NULL)

{

if(p->data>=x)

break

k=p

p=p->next

}

if(p==L)

{

L=s

s->next=p

}

else

if(p==NULL)

{

k->next=s

}

else

{

k->next=s

s->next=p

}

}

void

output()//将链表输出

{

Linklist

*p

p=L

cout<<"链表中的元素为:"

while(p!=NULL)

{

cout<<p->data<<"

"

p=p->next

}

cout<<endl<<endl

}

void

LinkListDemo()

{

//

L是无头结点的单链表

Linklist

*q,

*p,*t//p指针用于指示原链表最后的结点(即an),q指针用于指示原来的头结点(即a1)

q=L

if

(

q

&&

q->next

)

{

t=q//将q指针指向a1

L=L->next//将L指针指向新链表的头结点(即a2)

rear->next=q

q->next=NULL

t=NULL

}

}

void

main()

{

create()

output()

int

x

cout<<"输入需要插入的元素:"

cin>>x

insert(x)

output()

cout<<"输入需要删除的元素:"

cin>>x

del(x)

output()

LinkListDemo()

output()

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7796603.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存