数据结构作业之静态链表

1.代码如下

#include <stdio.h>
#include <malloc.h>
#define DEFAULT_SIZE 5

typedef struct StaticLinkedNode
{
	char data;
	int next;
}*NodePtr;

typedef struct StaticLinkedList
{
	NodePtr nodes;
	int *used;
}*ListPtr;

/**
 * initial the list with a pointer
 */
 
ListPtr initLinkedList()
{
	// the pointer to the whole space
	ListPtr tempPtr=(ListPtr)malloc(sizeof(struct StaticLinkedList));
	
	//allocate total space
	tempPtr->nodes=(NodePtr)malloc(sizeof(struct StaticLinkedNode)*DEFAULT_SIZE);
	tempPtr->used=(int*)malloc(sizeof(int)*DEFAULT_SIZE);
	
	//the first node is the header
	tempPtr->nodes[0].data='\0';
	tempPtr->nodes[0].next=-1;
	
	//0:the space is not used 
	//1:the space is used 
	tempPtr->used[0]=1;
	int i;
	for(i=1;i<DEFAULT_SIZE;i++)
	{
		tempPtr->used[i]=0;
	}
	return tempPtr;
}

/**
 * print the list
 */
 
void printList(ListPtr paraListPtr)
{
	int p=0;
	while(p!=-1)
	{
		printf("%c",paraListPtr->nodes[p].data);
		p=paraListPtr->nodes[p].next;
	}
	printf("\r\n");
 } 

/**
 * insert an elemen to the specific position 
 */

void insertElement(ListPtr paraListPtr, char paraChar, int paraPosition)
{
	int p,q,i;
	
	//step 1. search to the position
	p=0;
	for(i=0;i<paraPosition;i++)
	{
		p=paraListPtr->nodes[p].next;
		if(p==-1)
		{
			printf("the position %d is beyond the scope of the list.\r\n",paraPosition);
			return ;
		}
	}
	
	//step 2.create a new node
	for(i=1;i<DEFAULT_SIZE;i++)
	{
		if(paraListPtr->used[i]==0)
		{
			printf("space at %d allocated.\r\n",i);
			paraListPtr->used[i]=1;
			q=i;
			break;
		}
	}
	if(i==DEFAULT_SIZE)
	{
		printf("No space.\r\n");
		return ;
	}
	paraListPtr->nodes[q].data=paraChar;
	
	//step 3.link the node
	printf("linking\r\n");
	paraListPtr->nodes[q].next=paraListPtr->nodes[p].next;
	paraListPtr->nodes[p].next=q; 
 } 
 
/**
 * delete an element from the list
 */
 
void deleteElement(ListPtr paraListPtr, char paraChar)
{
	int p,q;
	p=0;
	while((paraListPtr->nodes[p].next!=-1)&&(paraListPtr->nodes[paraListPtr->nodes[p].next].data!=paraChar))
	{
		p=paraListPtr->nodes[p].next;
	}
	
	if(paraListPtr->nodes[p].next==-1)
	{
		printf("Cannot delete %c\r\n",paraChar);
		return ;
	}
	
	q=paraListPtr->nodes[p].next;
	paraListPtr->nodes[p].next=paraListPtr->nodes[q].next;
	
	//free the deleted node
	paraListPtr->used[q]=0; 
}

/**
 * test the functions above
 */
 
void appendInsertDeleteTest()
{
	//step 1.initialize an empty list
	ListPtr tempList=initLinkedList();
	printList(tempList);
	
	//step 2.add some elements
	insertElement(tempList,'H',0);
	insertElement(tempList,'e',1);
	insertElement(tempList,'l',2);
	insertElement(tempList,'l',3);
	insertElement(tempList,'o',4);
	printList(tempList);
	
	//step 3.delete some  elements
	printf("Deleting 'e'.\r\n");
	deleteElement(tempList,'e');
	printf("Deleting 'a'.\r\n");
	deleteElement(tempList,'a');
	printf("Deleting 'o'.\r\n");
	deleteElement(tempList,'o');
	printList(tempList);
	
	insertElement(tempList,'x',1);
	printList(tempList);
}

void main()
{
	appendInsertDeleteTest();
 } 

2.图示

3.代码说明

1)用一个动态数组来记录节点是否被使用,0代表未被使用,1代表已被使用

2)当node的next表示-1时,表示NULL

3)在进行插入操作时仍然要考虑是否越界的情况

4)在进行删除操作时要考虑是否到达了链表的末尾

4.运行结果


space at 1 allocated.
linking
space at 2 allocated.
linking
space at 3 allocated.
linking
space at 4 allocated.
linking
No space.
 Hell
Deleting 'e'.
Deleting 'a'.
Cannot delete a
Deleting 'o'.
Cannot delete o
 Hll
space at 2 allocated.
linking
 Hxll

--------------------------------
Process exited after 0.04866 seconds with return value 0
请按任意键继续. . .

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值