怎样在C语言创建线性表?

怎样在C语言创建线性表?,第1张

#include"stdioh"\x0d\#include\x0d\ \x0d\typedef char ElemType;\x0d\ \x0d\typedef struct LNode\x0d\{ElemType data;\x0d\struct LNode next;\x0d\}LinkList;\x0d\ \x0d\void CreatListF(LinkList &L,ElemType a[],int n) //头插法建表\x0d\{\x0d\ LinkList s;int i;\x0d\ L=(LinkList )malloc(sizeof(LinkList));\x0d\ L->next=NULL;\x0d\ for(i=0;idata=a[i];\x0d\ s->next=L->next;\x0d\ L->next=s;\x0d\ }\x0d\}\x0d\ \x0d\void CreateListR(LinkList &L,ElemType a[],int n) //尾插法建表\x0d\{\x0d\ LinkList s,r;int i;\x0d\ L=(LinkList )malloc(sizeof(LinkList));\x0d\ r=L;\x0d\ for(i=0;idata=a[i];\x0d\ r->next=s;\x0d\ r=s;\x0d\ }\x0d\ r->next=NULL;\x0d\}\x0d\\x0d\void InitList(LinkList &L) //初始化线性表\x0d\{\x0d\ L=(LinkList )malloc(sizeof(LinkList));\x0d\ L->next=NULL;\x0d\}\x0d\ \x0d\void DestroyList(LinkList &L) //销毁线性表\x0d\{\x0d\ LinkList p=L,q=p->next;\x0d\ while(q!=NULL)\x0d\ {\x0d\ free(p);\x0d\ p=q;\x0d\ q=p->next;\x0d\ }\x0d\ free(p);\x0d\}\x0d\ \x0d\int ListEmpty(LinkList L) //判断线性表是否为空\x0d\{\x0d\ return(L->next==NULL);\x0d\}\x0d\ \x0d\int ListLength(LinkList L) //求线性表的长度\x0d\{\x0d\ LinkList p=L;int n=0;\x0d\ while(p->next!=NULL)\x0d\ {\x0d\ n++;p=p->next;\x0d\ }\x0d\ return(n);\x0d\}\x0d\ \x0d\void DispList(LinkList L) //输出线性表\x0d\{\x0d\ LinkList p=L->next;\x0d\ while(p!=NULL)\x0d\ {\x0d\ printf("%c",p->data);\x0d\ p=p->next;\x0d\ }\x0d\}\x0d\ \x0d\int GetElem(LinkList L,int i,ElemType &e) //求线性表中某个数据元素值\x0d\{\x0d\ int j=0;\x0d\ LinkList p=L;\x0d\ while(jnext;\x0d\ }\x0d\ if(p==NULL)\x0d\ return 0;\x0d\ else\x0d\ {\x0d\ e=p->data;return 1;\x0d\ }\x0d\}\x0d\ \x0d\int LocateElem(LinkList L,ElemType e) //按元素值查找\x0d\{\x0d\ LinkList p=L->next;\x0d\ int i=1;\x0d\ while(p!=NULL&&p->data!=e)\x0d\ {\x0d\ p=p->next;i++;\x0d\ }\x0d\ if(p==NULL)return(0);\x0d\ else return(i);\x0d\}\x0d\ \x0d\int ListInsert(LinkList &L,int i,ElemType e) //插入数据元素\x0d\{\x0d\ int j=0;\x0d\ LinkList p=L,s;\x0d\ while(jnext;\x0d\ }\x0d\ if(p==NULL)return 0;\x0d\ else\x0d\ {\x0d\ s=(LinkList )malloc(sizeof(LinkList));\x0d\ s->data=e; s->next=p->next; p->next=s;\x0d\ return 1;\x0d\ }\x0d\}\x0d\ \x0d\int ListDelete(LinkList &L,int i,ElemType &e) //删除数据元素\x0d\{\x0d\ int j=0;\x0d\ LinkList p=L,q;\x0d\ while(jnext;\x0d\ }\x0d\ if(p==NULL)\x0d\ return 0;\x0d\ else\x0d\ {\x0d\ q=p->next;\x0d\ if(q==NULL)return 0;\x0d\ e=q->data;\x0d\ p->next=q->next;\x0d\ free(q);\x0d\ return 1;\x0d\ }\x0d\}\x0d\\x0d\int main()\x0d\{\x0d\ ElemType e,a[5]={'a','b','c','d','e'};\x0d\ LinkList h;\x0d\ \x0d\ InitList(h); //初始化顺序表h\x0d\ CreateListR(h,&a[0],5); //依次采用尾插入法插入a,b,c,d,e元素\x0d\ printf("单链表为:"); \x0d\ DispList(h); printf("\n"); //输出顺序表h\x0d\ \x0d\ printf("该单链表的长度为:"); \x0d\ printf("%d",ListLength(h)); printf("\n"); //输出顺序表h的长度\x0d\ if(ListEmpty(h)) printf("该单链表为空。\n"); \x0d\ else printf("该单链表不为空。\n"); //判断顺序表h是否为空\x0d\ \x0d\ GetElem(h,3,e);printf("该单链表的第3个元素为:"); \x0d\ printf("%c",e); printf("\n"); //输出顺序表h的第3个元素\x0d\ printf("该单链表中a的位置为:"); \x0d\ printf("%d",LocateElem(h,'a')); printf("\n"); //输出元素'a'的位置\x0d\ \x0d\ ListInsert(h,4,'f'); //在第4个元素位置插入'f'素\x0d\ printf("在第4 个元素位置上插入'f'后单链表为:"); \x0d\ DispList(h); printf("\n"); //输出顺序表h\x0d\ \x0d\ ListDelete(h,3,e); //删除L的第3个元素\x0d\ printf("删除第3个元素后单链表为:");\x0d\ DispList(h); printf("\n"); //输出顺序表h\x0d\ \x0d\ DestroyList(h); //释放顺序表h\x0d\ return 0;\x0d\}

用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;
}
}


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

原文地址: https://outofmemory.cn/yw/12706958.html

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

发表评论

登录后才能评论

评论列表(0条)

保存