线性表的链式存储结构(静态链表)

1. 静态链表的定义

    首先要定义一个链表结点类型,为一个结构体,

typedef struct spy {
	char *name;
	struct spy *next;
}spy, *p_spy;

  然后定义每一个结点,

spy A = {"A", NULL};
spy B = {"B", NULL};
spy C = {"C", NULL};

最后建立结点之间的链接,访问一个链表只需要一个头指针。

	p_spy head = NULL;
	
	A.next = &B;
	B.next = &C;
	C.next = NULL;

	head = &A;

2. 静态链表的插入

p_spy head = NULL;

void insert_spy(p_spy newspy)
{
	p_spy last;
	
	if (head == NULL)
	{
		head = newspy;
		newspy->next = NULL;
	}
	else
	{
		/* 先找到链表的最后一项 last */
		last = head;
		while (last)
		{
			if (last->next == NULL) /* 找到了 */
				break;
			else
				last = last->next;
		}
		
		/*  */
		last->next = newspy;
		newspy->next = NULL;
	}
}

      有了上面的插入函数,就不需要手动建立链表的链接,而是直接调用这个函数实现链表的建立。注意这个函数虽然名字叫插入,但是实际上叫追加更加准确,真正的插入是可以在任意位置插入的,而不是只能在尾巴插入。

      如果要在任意位置插入,需要增加一个参数用作插入位置,函数体可以参考另外一篇文章动态链表

3. 静态链表的删除

void remove_spy(p_spy oldspy)
{
	p_spy left;
	
	if (head == oldspy)
	{
		head = oldspy->next;
	}
	else
	{
		/* 找出oldspy的上线 */
		left = head;
		while (left)
		{
			if (left->next == oldspy)
				break;
			else
				left = left->next;
		}
		
		if (left)
		{
			left->next = oldspy->next;
		}
	}
}

      上面函数就可以移除一个结点,但是这个函数还可以优化一下,比如里面增加判断是否为空链表,如果为空链表,就没有结点可以移除了。

猜你喜欢

转载自blog.csdn.net/fengel_cs/article/details/120623710