1. 程式人生 > >大三秋季數據結構課程代碼整理

大三秋季數據結構課程代碼整理

des 使用 單鏈表 位置參數 del std 無法 輸出 class

數學系上的數據結構課程相對比較水:),下面的代碼是朱明老師布置的習題.

//課本為?數據結構-使用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;
    }

}

//未完待續...

大三秋季數據結構課程代碼整理