大三秋季数据结构课程代码整理

数学系上的数据结构课程相对比较水:),下面的代码是朱明老师布置的习题.

//课本为«数据结构-使用C语言»,作者:朱战立.

先抛出头文件:

//SeqList.h
typedef struct
{
    DataType  list[MaxSize];
    int  size;
}SeqList;
void  ListInitiate(SeqList  *L)
{
     L->size=0;
}
int  ListLength(SeqList  L)
{
     return  L.size;
}
int  ListInsert(SeqList  *L,int  i,DataType  x)
{
      int  j;
      if(L->size>=MaxSize)
      {
          printf("顺序表已满无法插入!\n");
          return  0;
       }
      else if(i<0 || i>L->size)
      {
          printf("参数i不合法!\n");
          return  0;
     }
  else
   {
       for(j=L->size;j>i;j--)L->list[j]=L->list[j-1];
       L->list[i]=x;
       L->size++;
       return  1;
    }
}
int  ListDelete(SeqList  *L,int  i,DataType  *x)
 {
     int  j;
     if(L->size<=0)
     {
         printf("顺序表已空无数据元素可删!\n");
         return  0;
     }
     else if(i<0 || i>L->size-1)
     {
         printf("参数i不合法!\n");
         return  0;
     }
     else
     {
         *x =L->list[i];
         for(j=i+1;j<=L->size-1;j++) L->list[j-1]=L->list[j];
         L->size--;
         return  1;
     }
 }
int  ListGet(SeqList  L,int  i,DataType  *x)
 {
     if(L.size<=0)
     {
         printf("顺序表已空无数据元素可取!\n");
         return  0;
     }
     else if(i<0 || i>L.size-1)
     {
         printf("参数i不合法!\n");
         return  0;
    }
     else
     {
         *x =L.list[i];
         return  1;
     }
 }
int ListPrint(SeqList L)
{
    int i;
    if(L.size == 0) {
        printf("empty list\n");
        return 0;
    }
    for(i=0;i<(L.size);i++) {
        printf("%d ",L.list[i]);
    }
    puts("");
    return 1;
}
int ListFind(SeqList L,DataType x)
{
    int id=-1,i;
    for(i=0;i<L.size;i++) {
        if(L.list[i]==x) {
            id = i;
            break;
        }
    }
    return id;
}
//LinList.h
typedef struct Node
{
    DataType data;
    struct Node *next;
}SLNode;

void ListInitiate(SLNode* *head)
{
    if((*head = (SLNode *)malloc(sizeof(SLNode)))==NULL) exit(1);
    (*head) -> next = NULL;
}

int ListLength(SLNode *head)
{
    SLNode *p = head;
    int ssize = 0;

    while(p->next != NULL) {
        p = p->next;
        ssize++;
    }

    return ssize;
}

int ListInsert(SLNode *head,int i,DataType x)
{
    SLNode *p,*q;
    int j;
    p = head;
    j = -1;
    while(p->next != NULL && j<i-1) {
        p = p->next;
        j++;
    }

    if(j!=i-1) {
        printf("插入位置参数错!\n");
        return 0;
    }

    if((q = (SLNode *)malloc(sizeof(SLNode))) == NULL) exit(1);
    q->data = x;

    q->next = p->next;
    p->next = q;
    return 1;
}

int ListDelete(SLNode *head,int i,DataType *x)
{
    SLNode *p,*s;
    int j;
    p = head;
    j = -1;
    while(p->next != NULL && p->next->next != NULL && j<i-1) {
        p = p->next;
        j++;
    }
    if(j!=i-1) {
        printf("删除位置参数错!\n");
        return 0;
    }
    s = p->next;
    *x = s->data;
    p->next = s->next;
    free(s);
    return 1;
}

int ListGet(SLNode *head,int i,DataType *x)
{
    SLNode *p;
    int j;
    p = head;
    j = -1;
    while(p->next != NULL && j<i) {
        p = p->next;
        j++;
    }
    if(j!=i) {
        printf("取元素位置参数错!\n");
        return 0;
    }
    *x = p->data;
    return 1;
}

void Destroy(SLNode* *head)
{
    SLNode *p,*q;
    p = *head;
    while(p!=NULL) {
        q = p;
        p = p->next;
        free(q);
    }
    *head = NULL;
}

void ListPrint(SLNode *head)
{
    SLNode *p = head->next;
    if(p==NULL) {
        puts("Empty List!");
    }

    while(p!=NULL) {
        printf("%d ",p->data);
        p=p->next;
    }
    puts("");
}

2-11:编写一个逐个输出顺序表中所有数据元素的算法

int ListPrint(SeqList L)
{
    int i;
    if(L.size == 0) {
        printf("表列为空\n");
        return 0;
    }
    for(i=0;i<(L.size);i++) {
        printf("%d ",L.list[i]);
    }
    puts("");
    return 1;
}

2-13:线性表定位操作ListFind(L,x)的功能是:在线性表L中查找是否存在数据元素x,如果存在,返回线性表中与x值相等的第一个数据元素的序号(序号编号从0开始),如果不存在,返回-1.要求编写顺序表的定位操作算法.

int ListFind(SeqList L,DataType x)
{
    int id=-1,i;
    for(i=0;i<L.size;i++) {
        if(L.list[i]==x) {
            id = i;
            break;
        }
    }
    return id;
}

2-16:编写算法实现顺序表的就地逆置,即要求利用原顺序表的存储单元,把数据元素序列$(a_{0},a_{1},...,a_{n-1})$逆置为$(a_{n-1},...,a_{1},a_{0})$.

void ListInverse(SeqList *L)
{
    int i,j;
    DataType t;
    for(i=0,j=(L->size)-1;i<j;i++,j--) {
        t = L->list[i];
        L->list[i] = L->list[j];
        L->list[j] = t;
    }
}

2-17:编写算法实现单链表的逆置,要求把单链表la中的数据元素序列$(a_{0},a_{1},...,a_{n-1})$逆置为$(a_{n-1},...,a_{1},a_{0})$,并把逆置后的数据元素存储到单链表lb中

void ListInverse2(SLNode* la,SLNode* lb)
{
    SLNode *p,*q;
    p = la->next;
    while(p!=NULL) {
        ListInsert(lb,0,p->data);
        p = p->next;
    }
}

2-18:编写算法实现单链表的就地逆置,即要求利用原单链表的结点空间,把数据元素序列$(a_{0},a_{1},...,a_{n-1})$逆置为$(a_{n-1},...,a_{1},a_{0})$.

void ListInverse1(SLNode *head)
{
    SLNode *p = head->next,*q;
    head->next = NULL;
    while(p!=NULL) {
        q = p;
        p = p->next;
        q->next = head->next;
        head->next = q;
    }

}

//未完待续...

猜你喜欢

转载自www.cnblogs.com/Keynman/p/9906769.html
今日推荐