谁能给一个简单的线性表操作C语言完整程序?

2024年11月28日 08:32
有2个网友回答
网友(1):

1、线性表有两种:

typedef struct {

ElemType* elem;

int length;

int listsize;

} SqList;//顺序表


void InitList_Sq (SqList& l) {

l.elem=new ElemType [LIST_INIT_SIZE];

l.length=0;

l.listsize=LIST_INIT_SIZE;

}//初始化顺序表

然后SqList La;

InitList_Sq(La);

就可以


typedef struct Lnode{

int data;

struct Lnode *next;

}Lnode,*LinkList;//线性链表

//单链表可以有效的利用主存的碎片,它的数据域不是连续的


2、例程:

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

网友(2):

这是我以前写的作业,比你这个题的要求还要多,肯定能满足你的要求。
#include"stdio.h"
#include

typedef char ElemType;

typedef struct LNode
{ElemType data;
struct LNode *next;
}LinkList;

void CreateListR(LinkList *&L,ElemType a[],int n) //尾插法建表
{
LinkList *s,*r;int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for(i=0;i {
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}

void InitList(LinkList *&L) //初始化线性表
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}

void DispList(LinkList *L) //输出线性表
{
LinkList *p=L->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
}

void CombList(LinkList *L1,LinkList *L2,LinkList *&k) //两个集合的交
{
LinkList *p=L1->next ,*q=L2->next ,*b,*a,*c;

k=(LinkList *)malloc(sizeof(LinkList));
b=k;a=p;
while(q!=NULL)
{
while(a!=NULL)
{
if(a->data==q->data)
{
c=(LinkList *)malloc(sizeof(LinkList));
c->data=a->data;b->next=c;b=b->next;
}
a=a->next;
}
q=q->next;
a=p;
}
b->next=NULL;
}

void AddList(LinkList *L1,LinkList *L2,LinkList *&k) //两个集合的并
{
LinkList *p=L1->next ,*q=L2->next ,*b,*a,*c;

k=(LinkList *)malloc(sizeof(LinkList));
b=k;a=p;

while(q!=NULL)
{
int x=0;
while(p!=NULL)
{
if(p->data==q->data)x++;
p=p->next;
}
if(!x)
{
c=(LinkList *)malloc(sizeof(LinkList));
c->data=q->data;b->next=c;b=b->next;
}
q=q->next;
p=a;
}
b->next=a;
}

void RankList(LinkList *&L) //按从小到大排列
{
LinkList *p=L->next,*q,*r;
if (p!=NULL)
{ r=p->next;
p->next=NULL;
p=r;
while (p!=NULL)
{ r=p->next;
q=L;
while (q->next!=NULL && q->next->datadata)
q=q->next;
p->next=q->next;
q->next=p;
p=r;
}
}
}
int main()
{
ElemType a[5]={'a','b','c','d','e'},b[4]={'e','f','g','h'};
LinkList *h1,*h2,*p1,*p2;

InitList(h1); //初始化顺序表h
InitList(h2);
CreateListR(h1,&a[0],5); //依次采用尾插入法插入a,b,c,d,e元素
CreateListR(h2,&b[0],4);
printf("单链表1为:");
DispList(h1); printf("\n"); //输出顺序表h
printf("单链表2为:");
DispList(h2); printf("\n");

CombList(h1,h2,p1); //求两个单链表的交
printf("这两个单链表的交为:");
DispList(p1); printf("\n");

AddList(h1,h2,p2); //求两个单链表的并
printf("这两个单链表的并为:");
DispList(p2); printf("\n");

RankList(p2); //对单链表按从小到大排列
printf("这个单链表排列后为:");
DispList(p2); printf("\n");

return 0;
}