c语言 建立线性表 链式

1.实验目的及要求
通过本实验,进一不了解线性表的操作,熟悉线性表的运算,了解链式存储结构的实现方法和在链式存储条件下实现线性的相关操作。
2.实验内容
用C 语言设计在链式存储结构下,建立、插入、删除、访问及输出线性表的程序。
3.实验类型:验证性实验。

#include
#include
typedef char elemtype;
typedef struct dnode
{elemtype data;
struct dnode *prior;
struct dnode *next;
}dlinklist;


void displist(dlinklist *L);
int listlength(dlinklist *L);
void list (void);
void initlist (dlinklist *&L);
void destorylist (dlinklist *L);
int listempty(dlinklist *L);
void listdelete (dlinklist *L,int i,elemtype &e);
void getelem (dlinklist *L,int i, elemtype &e);
int locateelem(dlinklist *L,elemtype e);
int listinsert (dlinklist *L,int i, elemtype e);



#include "head.h"
int length;
#include "head1.h"
int main (void)
{char ch;
dlinklist *L;
elemtype e;
int i;
while(1)
{list();
     ch=getchar();getchar();
  switch(ch)
  {case '0': exit(0);
   case '1': initlist(L);break;
   case '2': destorylist(L);break;
   case '3': printf("The length is %d\n",listlength(L));break;
   case '4': if(listempty(L)) printf("表不空!\n");
           else printf("表空!\n");break;
   case '5': printf("请输入要取的元素的序号(1-%d)\n",length);scanf("%d",&i);getchar();
           if(i>length)printf("只有%d个元素\n",length);
            else if(length==0) printf("空表!\n");
         else {getelem(L,i,e);printf("第%d个元素为%c\n",i,e);}break;
   case '6': printf("请输入要找的元素\n"); scanf("%c",&e);getchar();i=locateelem(L,e);
          if(i==0) printf("未找到!\n");
           else printf("%c为第%i个元素\n",e,i);break;
   case '7': printf("请输入要插入的元素及其序号(1-%d)\n",length+1);
          scanf("%c%d",&e,&i);getchar();
      if(listinsert(L,i,e))
         printf("插入成功!\n");
      else printf("插入失败!\n");break;
   case '8': if(!listempty(L)) printf("空表\n");
           else displist(L);break;
   case '9': printf("请输入要删除的元素的序号:\n"); scanf("%d",&i);getchar();
          if (i>length)  printf("只有%d个元素!\n",length);
          listdelete(L,i,e); printf("删除的元素为%c\n",e); break;
   default: printf("输入错误!请重新输入\n");
  }
}
return 0;
}
#include
void list (void)
{printf("***************************************\n");
printf("1: 初始化链表               2: 释放链表\n");
printf("3: 求元素个数               4: 链表判空\n");
printf("5: 取第i 元素               6: 找元素e \n");
printf("7: 插入元素e                8: 输出链表\n");
printf("9: 删除第i 元               0: 退出程序\n");
printf("***************************************\n");
printf("       请在上述功能中选择(0-9):");
}

#include"head.h"
extern int length;
void destorylist (dlinklist *L)
{ dlinklist *p=L->next;
if (length!=0)
{while(p!=L)
    {L->next=p->next;
     p->next->prior=L;
     free(p);p=L->next;
  }
length=0;
}
}



void displist(dlinklist *L)
{dlinklist *p=L->next;
while(p!=L)
{printf("%c  ",p->data); p=p->next;}
printf("\n");
}

void getelem (dlinklist *L,int i, elemtype &e)
{int j=1;dlinklist *p=L->next;
while(p!=L&&j
{p=p->next;j++;}
e=p->data;
}
extern int length;
void initlist (dlinklist *&L )
{
L=(dlinklist *)malloc(sizeof(dlinklist));
if(!L)
printf("初始化失败!\n");
else
{length=0;L->next=L->prior=L;}
}

void listdelete (dlinklist *L,int i,elemtype &e)
{dlinklist *p=L->next;
int j=1;
while(p!=L&&j

{p=p->next;j++;}
if(j==i)
{p->prior->next=p->next;
p->next->prior=p->prior;
e=p->data;free(p);
length--;}
}

int listempty(dlinklist *L)
{
int i=0;
dlinklist *p=L->next;
     while(p!=L)
  {p=p->next;i++;}
  return i;
}

int listinsert (dlinklist *L,int i, elemtype e)
{dlinklist *p=L->next,*q;int j=1;
  while(p!=L&&j
  {p=p->next;j++;}
  if(j==i)
{q=(dlinklist *)malloc(sizeof(dlinklist));
     if(!q) return 0;
  q->data=e; length++;
  q->prior=p->prior;
  p->prior->next=q;
  q->next=p;
  p->prior=q;
  return 1;
  }
  else return 0;
}

int listlength(dlinklist *L)
{return length;
}

int locateelem(dlinklist *L,elemtype e)
{dlinklist *p=L->next;
int i=1;
while(p!=L&&p->data!=e)
{p=p->next;i++;}
if(p->data!=e)return 0;
else return i;
}

 

 

2》有人说上面的太繁琐,看不懂。好吧来个简单的创建删除插入

#include <iostream.h>
#include <malloc.h> //Using malloc and realloc
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define TRUE true
#define FALSE false
#define ElemType int
 
typedef struct 
{
ElemType *elem; //数据元素的基地址
int length; //线性表的当前长度
int listsize; //当前分配的存储容量
}SqList;

bool InitList_Sq (SqList &L)
{ //malloc和new的区别请看说明1
  L.elem =(ElemType*) malloc(LIST_INIT_SIZE*sizeof(ElemType));//分配空间
//L.elem=new ElemType[LIST_INIT_SIZE]; //分配空间
if (!L.elem) return FALSE;
L.length=0; //将当前线性表长度置0
L.listsize=LIST_INIT_SIZE;
return TRUE;//成功返回OK 
}

void DestroyList_Sq(SqList &L)
{
if (L.elem) free(L.elem); //释放线性表的存储空间
L.elem=NULL;
L.length=0;
L.listsize=0;
}


void ClearList_Sq (SqList &L) //清空线性表L
{
L.length=0; //将线性表的长度置为0
}

bool ListEmpty_Sq (SqList &L)//判断线性表L是否为空
{
  if (L.length==0) return TRUE;  
  else return FALSE;
}
  
int ListLength_Sq (SqList &L)//求线性表L的长度
{
  return (L.length);  
}

ElemType GetElem_Sq (SqList &L, int i)//获取线性表L中的某个数据元素的内容
{
ElemType e;
  if (i<0||i>L.length) return FALSE;//失败返回i值不合法; 
  e=L.elem[i]; 
return e;

}

  
int LocateElem_Sq (SqList &L, ElemType e)//在线性表L中检索值为e的第一个数据元素
{  
for (int i=1; i<=L.length; ++i)
if (L.elem[i]==e) return i;
  return FALSE;
}


bool ListInsert_Sq (SqList &L, int i, ElemType e)//在线性表L中下标为i的数据元素之前插入数据元素e  
{
 
if (i<1||i>L.length+1) 
{
cout<<"i值不合法"<<endl;//i值不合法
return FALSE;
}
if (L.length>=L.listsize) 
{
L.elem=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));//realloc的返回值请看说明2
if(!L.elem) {cout<<"OVERFLOW"<<endl; return FALSE;}//存储分配失败
L.listsize+=LISTINCREMENT;//增加存储容量
}

for (int j=L.length; j>=i; --j) 
L.elem[j+1] = L.elem[j];
  L.elem[i]=e; ++L.length; return TRUE;
}

  
ElemType ListDelete_Sq(SqList &L, int i, ElemType e)// 将线性表L中第i个数据元素删除
{
  if (ListEmpty_Sq(L)) return FALSE; 
if (i<1 || i>L.length) 
{
cout<<"i值不合法"<<endl;//i值不合法
return FALSE;

e=L.elem[i]; 
  for (int j=i+1; j<=L.length; j++) 
L.elem[j-1]=L.elem[j];
  L.length--; return e;
}
//------------------算法2.1--------------------------------------
void union_Sq(SqList &La,SqList &Lb)
{
//说明
//算法的功能是将所有在线性表Lb中但不在La中的数据元素插入到La中
for(int i=1;i<=7;++i)
{
ElemType e=GetElem_Sq(Lb,i);
  if(!LocateElem_Sq(La,e)) ListInsert_Sq(La,La.length+1,e);
}
}

//-----------------算法2.2--------------------------------
void MergeList_Sq(SqList &La,SqList &Lb,SqList &Lc)
{
int i=1;
int j=1;
int k=0;
ElemType e1,e2;
while(i<=La.length && j<=Lb.length)//La和Lb均非空
{

e1=GetElem_Sq(La,i);e2=GetElem_Sq(Lb,j);
if(e1<e2) {ListInsert_Sq(Lc,++k,e1);++i;}
else {ListInsert_Sq(Lc,++k,e2);++j;}
}
while(i<=La.length)
{e1=GetElem_Sq(La,i++);ListInsert_Sq(Lc,++k,e1);}//注意i
while(j<=Lb.length)
{e2=GetElem_Sq(Lb,j++);ListInsert_Sq(Lc,++k,e2);}


}

//---------------------------主函数-------------------------------------
void main()
{
  SqList la,lb;
InitList_Sq(la);
InitList_Sq(lb);
  //线性表La中的元素为[3,5,8,11],线性表Lb中的元素为[2,6,8,9,11,15,20]
  ListInsert_Sq (la, 1, 3);ListInsert_Sq (la, 2, 5);ListInsert_Sq (la, 3, 8);ListInsert_Sq (la, 4, 11);
  ListInsert_Sq (lb, 1, 2);ListInsert_Sq (lb, 2, 6);ListInsert_Sq (lb, 3, 8);ListInsert_Sq (lb, 4, 9);ListInsert_Sq (lb, 5, 11);ListInsert_Sq(lb, 6, 15);ListInsert_Sq(lb,7,20);

//------------------算法2.1的测验--------------------------------------
 

//------------------算法2.2的测验-------------------------------------- 

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jarry.liu

如果对您有帮助,鼓励下博主吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值