c语言 建立线性表 链式

来源:互联网 发布:东莞网络炒作团队 编辑:程序博客网 时间:2024/06/16 12:50

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 lengthis %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 mallocand 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, inti)//获取线性表L中的某个数据元素的内容
{
ElemType e;
  if(i<0||i>L.length) returnFALSE;//失败返回i值不合法; 
  e=L.elem[i]; 
return e;

}

  
int LocateElem_Sq (SqList &L, ElemTypee)//在线性表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, ElemTypee)//在线性表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, ElemTypee)// 将线性表L中第i个数据元素删除
{
  if (ListEmpty_Sq(L)) returnFALSE; 
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 0