【C語言數據結構】線性表五:線性表的鏈式表示和實現(靜態鏈表代碼)

一.問題((A-B)U(B-A))靜態鏈表實現

*《數據結構》P33

*  需要注意的是算法2.14沒什麼好說的,只是初始化整個結構體數組,算法2.15是在整個備用空間取一個結點當成新鏈表,算法2.16是把不再使用的節點還到備用鏈表上

* 可以看到算法2.17就是主要的算法了,其主要結構就是兩個for循環,第一個for循環用於建立集合A的靜態鏈表,第二個for用來輸入集合B的元素,在每一趟循環中用while去遍歷鏈表A,看元素是插入還是刪除

二.代碼與結果

#ifndef __HEAD_H__
#define __HEAD_H__ 100
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>

#define MAXSIZE 10
#define PRINT(format,...) printf(format,##__VA_ARGS__)

/*static linklist*/
typedef struct
{
    int data;
    int cur;
} SLinkList;

/*function declarations*/
void initspace_sl(SLinkList* s);
void diff_sl(SLinkList * s);
void print_sl(SLinkList* s);
#endif
#include "head.h"
#define DEBUG 100
int main(void)
{
    SLinkList s[MAXSIZE];
    initspace_sl(&s[0]);

#ifdef DEBUG
    print_sl(s);
#endif

    diff_sl(s);
    print_sl(s);
    return 0;
}

 

#include "head.h"
static int malloc_sl(SLinkList* s)
{
    int i = 0;
    i = s[0].cur;
    if(i != 0)
    {
        s[0].cur = s[i].cur;
    }
    return i;
}

/*將下標爲k的節點回收*/
static void free_sl(SLinkList* s, int k)
{
    s[k].cur = s[0].cur;
    s[0].cur = k;
    s[k].data = 0xFFFFFFFF;
    return;
}

/*(A - B) U (B - A)*/
/*首先假設A={1, 3, 4}
  首先假設B={2, 4, 6}
 */
void diff_sl(SLinkList* s)
{
    int head = 0;
    int i = 0;    //for circle
    int j = 0;    //for circle
    int k = 0;    //for traverse chain-A
    int prev = 0; //for traverse chain-A record previous pos
    int rear = 0;
    int tmp_b = 0;

    head = malloc_sl(s);
    rear = head;

    /*chain A*/
    for(i = 0; i < 3; i++)
    {
        j = malloc_sl(s);
        PRINT("Please input data to A:%d/3:", i+1);
        scanf("%d", &(s[j].data));
        s[rear].cur = j;
        rear = j;
    }
    s[rear].cur = 0;

    /*chain B*/
    for(i = 0; i < 3; i++)
    {
        PRINT("Please input data to B:%d/3:", i+1);
        scanf("%d", &tmp_b);
        k = s[head].cur;
        while((k != s[rear].cur) && (s[k].data != tmp_b))
        {
            prev = k;
            k = s[k].cur;
        }
        /*當前表中不存在該元素,插入在rear之後
         *且rear位置不變
         */
        if(k == s[rear].cur)/*insert*/
        {
            j = malloc_sl(s);
            s[j].data = tmp_b;
            s[j].cur = s[rear].cur;
            s[rear].cur = j;
        }
        else               /*delete*/
        {
            s[prev].cur = s[k].cur;
            if(k == rear)
            {
                rear = prev;
            }
            free_sl(s, k);
        }
    }
    return;
}

void initspace_sl(SLinkList* s)
{
    int i = 0;
    for(i = 0; i < MAXSIZE; i++)
    {
        s[i].data = 0xFFFFFFFF;
        s[i].cur = i + 1;
    }
    s[MAXSIZE - 1].cur = 0;
    return;
}

void print_sl(SLinkList* s)
{
    int i = 0;
    PRINT("=====START=====\n");
    for(i = 0; i < MAXSIZE; i++)
    {
        PRINT("s[%d].data = %#x, s[%d].cur = %d\n", i, s[i].data, i, s[i].cur);
    }
    PRINT("=====ENDOF=====\n");
    return;
}

 情形一:A={1,3,5} B={2,4,6}  (A - B)U(B - A)={1,3,5,6,4,2}

 情形二:A={1,3,4} B={2,4,6}  (A - B)U(B - A)={1,3,6,2}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章