5659 静态链表

TZOJ 5659 静态链表

静态链表,也是线性存储结构的一种,它兼顾了顺序表和链表的优点。

静态链表将数据全部存储在数组中,但存储位置并不连续,查找下一个元素通过一个整型变量(称为"游标",和指针功能类似)完成。

通常,静态链表会维持两个链表:数据链表(存储数据)和备用链表(空闲内存),数据链表的下标从1开始,备用链表的下标从0开始,而链表的末尾游标值为0(0位置不存储数据),例如使用静态链表存储 {1,2,3} 的过程如下:
5659 静态链表_第1张图片
静态链表的一个元素类型如下:

typedef struct

{

    int data;//数据

    int cur;//游标

}Node;

创建一个静态链表(带头结点),并对其进行若干的插入和删除操作,输出每次的执行情况。

要求:

当插入一个元素时,取备用链表的第一个元素(非头结点),将其加入到数据列表中。当删除一个元素时,将结点重新放回备用链表的第一个结点位置。
部分代码已经给定,请将其补充完整,提交时请勿包含给定代码。

//创建备用链表
void Reserve(Node a[])
{
    int i;
    for (i=0; i<maxSize; i++)
    {
        a[i].cur=i+1;//将每个数组分量链接到一起
    }
    a[maxSize-1].cur=0;//链表最后一个结点的游标值为0
}

void Print(Node a[], int first)
{
    int t = a[first].cur;
    while (t)
    {
        printf("%d, %d\n",a[t].data,a[t].cur);
        t = a[t].cur;
    }
}

int main()
{
    int head, pos, x;
    char cmd[20];
    Node a[maxSize];
    Reserve(a);
    head = Init(a);//输入数据创建静态链表
    while(scanf("%s", cmd)!=EOF)
    {
        if(strcmp(cmd, "Insert")==0)
        {
            scanf("%d%d", &pos, &x);
            Insert(a, head, pos, x);//将x插入到pos位置前
        }
        else
        {
            scanf("%d", &x);
            Delete(a, head, x);//删除第一个值为x的元素
        }
        Print(a, head);
    }
    return 0;
}

输入:

第一行为n,第二行为n个整数,表示初始情况下链表中的元素值。

随后输入若干命令,命令包含:

(1)插入元素:Insert pos x,表示将x插入到pos位置(从1开始,数据保证位置有效)之前;

(2)删除元素:Delete x,表示删除链表中第一个值为x的元素(不得删除头结点)。

以EOF结束,链表元素最多不会超过10个元素。
输出:

当执行Delete命令时,如果元素不存在,输出Error,单独一行。

每执行完一条指令后,均输出链表各个元素的数据和游标值(逗号+空格隔开),具体格式见样例。

样例输入
2
1 2
Delete 3
Insert 2 3

样例输出
Error
1, 3
2, 0
1, 4
3, 3
2, 0
思路: 用数组模拟指针,插入时通过备用链表头获得用第一个空节点的下标,用第一个空节点存储插入的数据即a[temp],该节点的游标指向插入前该位置的节点,即a[temp].cur = a[t].cur (t 为插入位置的上一个节点)a[t]再指向a[temp].

#include 
#include 
#define maxSize 13
//创建备用链表
typedef struct {
	int data;
	int cur;
}Node;

int Init(Node a[])
{
	int n, cnt;
	scanf("%d", &n);
	int emp = a[1].cur;
	for (cnt = 1; cnt <= n; cnt++) {
		scanf("%d", &a[emp].data);
		if (cnt != n) {
			a[emp].cur = emp + 1;
			emp++;
		}
		else {
			a[emp].cur = 0;
			emp++;
		}
	}
	a[0].cur = emp;
	return 1;
}
void Insert(Node a[], int head, int pos, int x)
{
	int cnt = 0;
	int t = head;
	while (t) {
		if (cnt == pos - 1) {
			break;
		}
		cnt++;
		t = a[t].cur;
	}
	int temp = a[0].cur;
	a[temp].data = x;
	a[0].cur = a[temp].cur;
	a[temp].cur = a[t].cur;
	a[t].cur = temp;
	
}
void Delete(Node a[], int head, int x)
{
	int t = head;
	int flag = 0;
	while (t) {
		int q = a[t].cur;
		if (a[q].data == x) {
			int tmp_cur = a[0].cur;
			a[0].cur = a[t].cur;
			a[t].cur = a[q].cur;
			a[q].cur = tmp_cur;
			flag = 1;
			break;
		}
		t = a[t].cur;
	}
	if (!flag) {
		printf("Error\n");
	}

}

你可能感兴趣的:(数据结构)