有沒有人能幫我寫一個“建立一個空線性表,給線性表賦值,實現插入、刪除操作”的程序,數據結構c語言版的


# include<stdio.h>
# include<stdlib.h>
# define LIST_INIT_SIZE 100
# define LISTINCREMENT 10
# define OVERFLOW -2
# define OK 1
# define ERROR 0
typedef int ElemType;

 typedef struct Sqlist
{
ElemType *elem;
int length;
int listsize;
}Sqlist;

void main()
{
Sqlist L;
int i,j,e;
Sqlist InitList_Sq();
int ListInsert_Sq(Sqlist L,int i,ElemType e);
int ListDelete_Sq(Sqlist L,int i);
    int PutList(Sqlist L);
L=InitList_Sq();
printf("線性表為:\n");
PutList(L);
printf("輸入插入的位置i:\n");
scanf("%d",&i);
printf("輸入插入的值:\n");
scanf("%d",&e);
ListInsert_Sq(L,i,e);
printf("線性表為:\n");
PutList(L);
printf("輸入刪除的位置i:\n");
scanf("%d",&j);
ListDelete_Sq(L,j);
printf("線性表為:\n");
PutList(L);
}

Sqlist InitList_Sq()
{
        Sqlist L;
int i;
ElemType* newbase;
L.elem=(ElemType*)malloc(LIST_INIT_SIZE *sizeof(ElemType));
if(!L.elem)
exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
printf("請輸入表中的數據:\n");
for(i=0;;i++)
{
scanf("%d",L.elem[i]);
++L.length;
    if(L.length>L.listsize)
{
     newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
     if(!newbase)
      exit(OVERFLOW);
     L.elem=newbase;
     L.listsize+=LISTINCREMENT;
}
}
return L;
}

int ListInsert_Sq(Sqlist L,int i,ElemType e)
{
ElemType *p,*q,*newbase;
    if(i<1||i>L.length+1)
return ERROR;
if(L.length>=L.listsize)
{
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q=&L.elem[i-1];
for(p=&L.elem[L.length-1];p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;
return OK;
}

int ListDelete_Sq(Sqlist L,int i)
{
ElemType e,*p,*q;
if(i<1||i>L.length)
return ERROR;
p=&L.elem[i-1];
e=*p;
q=&(L.elem[L.length-1]);
for(++p;p<=q;++p)
*(p-1)=*p;
--L.length;
printf("刪除的元素為:\n%d\n",e);
return OK;
}

int PutList(Sqlist L)
{
int *p,*q;
p=L.elem;
q=L.elem+(L.length-1);
for(p=L.elem;p<=q;++p)
{
printf("%d",*p);
}
return OK;
}

程序不能運行,可不可以告訴我問題出在哪兒?實在是搞不懂數據結構要怎么寫

5 个解决方案

#1


給我說一下怎樣初始化線性表也行啊

#2


哎!自己結貼吧
# include<stdio.h>
# include<stdlib.h>
# define LIST_INIT_SIZE 100
# define LISTINCREMENT 10
# define OVERFLOW -2
# define OK 1
# define ERROR 0
typedef int ElemType;

  typedef struct Sqlist
{
  ElemType *elem;
      int length;
      int listsize;
}Sqlist;

void main()
{
Sqlist *L,S;
    L=&S;
    int i,j,e,n;
    int InitList_Sq(Sqlist *L,int n);
    int ListInsert_Sq(Sqlist *L,int i,ElemType e);
    int ListDelete_Sq(Sqlist *L,int i);
    int PutList(Sqlist *L);
printf("輸入表的長度:\n");
scanf("%d",&n);
    InitList_Sq(L,n);
    PutList(L);
    printf("輸入插入的位置:\n");
    scanf("%d",&i);
    printf("輸入插入的值:\n");
    scanf("%d",&e);
    ListInsert_Sq(L,i,e);
    PutList(L);
    printf("輸入刪除的位置:\n");
    scanf("%d",&j);
    ListDelete_Sq(L,j);
    PutList(L);
}

int InitList_Sq(Sqlist *L,int n)
{
    int i;
    ElemType *newbase;
    L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L->elem)
exit(OVERFLOW);
    L->length=0;
    L->listsize=LIST_INIT_SIZE;
   printf("請輸入表中的數據:\n");
   for(i=0;i<n;i++)
   { 
   scanf("%d",&L->elem[i]);
       ++L->length;
       if(L->length>L->listsize)
   {
   newbase=(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
           if(!newbase)
   exit(OVERFLOW);
           L->elem=newbase;
           L->listsize+=LISTINCREMENT;
   }
   }
    return OK;
}

int ListInsert_Sq(Sqlist *L,int i,ElemType e)
{
 ElemType *p,*q,*newbase;
 if(i<1||i>L->length+1)
 return ERROR;
 if(L->length>=L->listsize)
 {
 newbase=(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
     if(!newbase)
     exit(OVERFLOW);
     L->elem=newbase;
     L->listsize+=LISTINCREMENT;
 }
 q=&L->elem[i-1];
 for(p=&L->elem[L->length-1];p>=q;--p)
 *(p+1)=*p;
 *q=e;
 ++L->length;
 return OK;
}

int ListDelete_Sq(Sqlist *L,int i)
{
 ElemType *p,*q;
 int e;
 if(i<1||i>L->length)
 return ERROR;
 p=&L->elem[i-1];
 e=*p;
 q=&(L->elem[L->length-1]);
 for(++p;p<=q;++p)
 *(p-1)=*p;
 --L->length;
 printf("刪除的元素為:\n%d\n",e);
 return 0;
}

int PutList(Sqlist *L)
{
 int *p,*q;
 p=L->elem;
 q=L->elem+(L->length-1);
 printf("線性表中元素為:\n");
 for(p=L->elem;p<=q;++p)
 {
 printf("%d  ",*p);
 }
 printf("\n表長為:%d  \n",L->length);
 return OK;
}

#3


該回復於2011-11-07 15:16:08被版主刪除

#4


 

#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

typedef int Status;
typedef char ElemType;

typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;

Status InitList(SqList &L){
//構造一個空的線性表L. 
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}

void DestoryList(SqList &L){
//銷毀線性表 
free(L.elem);
L.elem=NULL;
L.length=0;
L.listsize=0;
}

void ClearList(SqList &L){
//清空線性表 
L.length=0;
}

Status ListEmpty(SqList L){
//判斷線性表是否為空 
if(L.length==0)  return TRUE;
else  return FALSE;
}

int ListLength(SqList L){
//返回線性表數據個數 
return L.length;
}

Status GetList(SqList L,int i,ElemType &e){
//用e返回線性表第i個數據元素的值 
if(i<1||i>L.length)  return ERROR;
e=L.elem[i-1];
return OK;
}

int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType)){
//在順序線性表中查找第一個值與e滿足compare()的元素的位序
//若找到則返回位序,否則返回0
int i=1;
ElemType *p=L.elem;
while(i<=L.length&&!(*compare)(*p++,e))
++i;
if(i<=L.length)  return i;
else return 0; 
}

Status ListInsert(SqList &L,int i,ElemType  e){
//在順序線性表L中第i個位置之前插入新的元素e
ElemType *p,*q,*newbase;
if(i<1||i>L.length+1) return ERROR;
if(L.length>=L.listsize){
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;

q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;
return OK;
}

Status ListDelete(SqList &L,int i,ElemType &e){
//在順序線性表L中刪除第i個元素,並用e返回其值 
ElemType *p,*q;
if((i<1)||(i>L.length))  return ERROR;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--L.length;
return OK;
}

int main()
{
SqList L;
ElemType e;
InitList(L);
ListInsert(L,1,'a');
ListInsert(L,2,'b');
ListDelete(L,1,e);
printf("%c\n%c\n",L.elem[1],e);
return 0;
}

							     

#5


謝謝你們給我回復啊,我可以結貼了

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com