用c++建立一个线性表有以下5步:
1、准备数据:
定义了顺序表的最大长度MAXLEN、顺序表数据元素的类型DATA以及顺序表的数据结构SLType。在数据结构SLType中,Listen为顺序表已存结点的数量,也就是当前顺序表的长度,ListData是一个结构数组,用来存放各个数据结点。我们认为该顺序表是一个班级学生的记录。其中,key为学号,name为学生的名称,age为年龄。因为数组都是从下标0开始的,为了使用方便,我们从下标1开始记录数据结点,下标0的位置不可用。
2、初始化顺序表:
在使用顺序表之前,首先创建一个空的顺序表,也就是初始化顺序表。这里,在程序中只需设置顺序表的结点数量ListLen为0即可。这样,后面需要添加的数据元素将从顺序表的第一个位置存储。
示例代码:
3、计算线性表的长度:计算线性表的长度也就是计算线性表中结点的个数,由于我们在SLType中定义了ListLen来表示结点的数量,所以我们只需要获得这个变量的值即可。
4、插入结点:
插入节点就是在线性表L的第i个位置上插入一个新的结点,使其后的结点编号依次加1。这时,插入一个新节点之后,线性表L的长度将变为n+1。插入结点 *** 作的难点在于随后的每个结点数据都要向后移动,计算机比较大,示例代码如下:
5、追加结点:
追加结点就是在顺序表的尾部插入结点,因此不必进行大量数据的移动,代码实现与插入结点相比就要简单的多。
连引用都不能传,还怎么会有值回来啊?看看这段代码呢!
#include <stdioh>
#define LIST_INIT_SIZE 5
#define LISTINCREMENT 1
struct SqList
{
int elem;
int length;//元素个数
int listsize;//存储空间大小
};
void InitList_Sq(struct SqList L)
{
int counter;
L->elem=malloc(LIST_INIT_SIZEsizeof(int));
printf("请为初始化顺序表输入%d个整数:\n",LIST_INIT_SIZE);
for(counter=0;counter<LIST_INIT_SIZE;counter++)
scanf("%d",&L->elem[counter]);
L->length=LIST_INIT_SIZE;
L->listsize=LIST_INIT_SIZE;
}
void Print_Sq(struct SqList K)
{
int role;
printf("\n");
for(role=0;role<LIST_INIT_SIZE;role++)
printf("%d ",Kelem[role]);
printf("\n\n");
}
void main()
{
struct SqList va;
InitList_Sq(&va);
Print_Sq(va);
}#include<stdioh>
#include<stdlibh>
#include<stringh>
# define null 0
typedef char ElemType; / 字符型数据/
typedef struct LNode
{
ElemType data;
struct LNode next;
};
void setnull(struct LNode p);
int length (struct LNode p);
ElemType get(struct LNode p,int i);
void insert(struct LNode p,ElemType x,int i);
int locate(struct LNode p,ElemType x);
void Delete(struct LNode p,int i);
void display(struct LNode p);
struct LNode reverse(struct LNode head);
main()
{
struct LNode head; /定义变量/
int select,x1,x2,x3;
int i,n;
int m,g;
char e,y;
setnull(&head); /建一链表并设置为空表/
printf("请输入数据长度: ");
scanf("%d",&n);
printf("将数据插入到单链表中: ");
for(i=1;i<=n;i++)
{
scanf("%c",&y);
if(y=='\n') i--;
else {
printf("将数据插入到单链表中: ");
insert(&head,y,i);
}
} /插入数据到链表/
display(&head); /显示链表所有数据/
printf("select 1 求长度 length()\n");
printf("select 2 取结点 get()\n");
printf("select 3 求值查找 locate()\n");
printf("select 4 删除结点 delete()\n");
printf("select 5 链表反转 reverse()\n");
printf("input your select: ");
scanf("%d",&select);
switch(select)
{
case 1:
{
x1=length(&head);
printf("输出单链表的长度%d\n ",x1);
display(&head);
}break;
case 2:
{
printf("请输入要取得结点: ");
scanf("%d",&m);
x2=get(&head,m);
printf("%c\n",x2);
display(&head);
}break;
case 3:
{
printf("请输入要查找的数据: ");
scanf("\n%c",&e);
x3=locate(&head,e);
printf("%d\n",x3);
display(&head);
}break;
case 4:
{
printf("请输入要删除的结点: ");
scanf("%d",&g);
Delete(&head,g);
display(&head);
}break;
case 5:
{
printf("链表反转:");
reverse(&head);
display(&head);
}break;
}
}
void setnull(struct LNode p)
{
p=null;
}
int length (struct LNode p)
{
int n=0;
struct LNode q=p;
while (q!=null)
{
n++;
q=q->next;
}
return(n);
}
ElemType get(struct LNode p,int i)
{
int j=1;
struct LNode q=p;
while (j<i&&q!=null)
{
q=q->next;
j++;
}
if(q!=null)
return(q->data);
else
printf("位置参数不正确!\n");
return null;
}
int locate(struct LNode p,ElemType x)
{
int n=0;
struct LNode q=p;
while (q!=null&&q->data!=x)
{
q=q->next;
n++;
}
if(q==null)
return(-1);
else
return(n+1);
}
void insert(struct LNode p,ElemType x,int i)
{
int j=1;
struct LNode s,q;
q=p;
s=(struct LNode )malloc(sizeof(struct LNode));
s->data=x;
if(i==1)
{
s->next=q;
p = s;
}
else
{
while(j<i-1&&q->next!=null)
{
q=q->next;
j++;
}
if(j==i-1)
{
s->next=q->next;
q->next=s;
}
else
printf("位置参数不正确!\n");
}
}
void Delete(struct LNode p,int i)
{
int j=1;
struct LNode q=p,t=null;
if(i==1)
{
t=q;
p=q->next;
}
else
{
while(j<i-1&&q->next!=null)
{
q=q->next;
j++;
}
if(q->next!=null&&j==i-1)
{
t=q->next;
q->next=t->next;
}
else
printf("位置参数不正确!\n");
}
if(t=null)
free(t);
}
void display(struct LNode p)
{
struct LNode q;
q=p;
printf("单链表显示: ");
if(q==null)
printf("链表为空!");
else if (q->next==null)
printf("%c\n",q->data);
else
{
while(q->next!=null)
{
printf("%c->",q->data);
q=q->next;
}
printf("%c",q->data);
}
printf("\n");
}
struct LNode reverse(struct LNode head)
{
struct LNode p,q;
p=null;
while((head)->next!=null)
{
q=p;
p=head;
(head)=(head)->next;
p->next=q;
}
(head)->next=p;
return head;
}#include <stdioh>
#include <malloch>
const int LIST_INIT_SIZE = 100;
typedef struct {
int elem;
int length;
int listsize;
}SqList;
int InitList_Sq(SqList L) {
(L)elem = (int )malloc(LIST_INIT_SIZE sizeof(int));
if (!(L)elem) return (0);
(L)length = 0;
(L)listsize = LIST_INIT_SIZE;
return (1);
}//InitList sq
int main() {
SqList L = (SqList )malloc(sizeof(SqList)); // 先获取框架,而后才可能有表
if(!InitList_Sq(L)) printf("failed to init\n");
else printf("init sq list complete\n");
printf("%d\n",L->listsize);
return 0;
}//---------------------------------------------------
//可创建任意长的链表
//---------------------------------------------------
#include<iostreamh>
void main()
{
struct list
{
int name;
list PN;
};
list head;
list ps;
list pend;
ps=new list;
cout<<"输入0表示结束输入";
cin>>ps->name;
head=NULL;
pend=ps;
while(ps->name!=0)
{
if(head==NULL)
head=ps;
else
pend->PN=ps;
pend=ps;
ps=new list;
cin>>ps->name;
}
pend->PN=NULL;
delete ps;
while(head)
{
cout<<head->name<<endl;
head=head->PN;
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)