线性表(顺序存储结构)
SQList.c
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 10
typedef unsigned short Bool;
typedef int Elemtype;
typedef struct
{
Elemtype *data;
int length;
int listSize;
} SQList;
Bool init(SQList *list)
{
if (list->data)
{
free(list->data);
}
list->data = (Elemtype *)malloc(LIST_INIT_SIZE * sizeof(Elemtype));
if (!list->data)
{
printf("内存分配失败!\n");
return FALSE;
}
list->length = 0;
list->listSize = LIST_INIT_SIZE;
return TRUE;
}
SQList *init()
{
SQList *list = (SQList *)calloc(1, sizeof(SQList));
if (!list)
{
printf("内存分配失败!\n");
return NULL;
}
if (init(list))
{
return list;
}
return NULL;
}
int getLength(SQList *list)
{
return list->length;
}
int locate(SQList *list, Elemtype elem)
{
Elemtype *data = list->data;
for (int i = 0; i < list->length; i++)
{
if (data[i] == elem)
{
return i + 1;
}
}
return 0;
}
Elemtype getElem(SQList *list, int index)
{
if (index < 1 || index > list->length)
{
printf("位序越界:%d 不在[1,%d]的范围内!\n", index, list->length);
exit(-1);
}
return list->data[index - 1];
}
Bool insert(SQList *list, int index, Elemtype elem)
{
if (index < 1 || index > list->length + 1)
{
printf("插入位置错误:%d 不在[1,%d]的范围内!\n", index, list->length + 1);
return FALSE;
}
if (list->length >= list->listSize)
{
Elemtype *newData = (Elemtype *)realloc(list->data, sizeof(Elemtype) * (list->listSize + LIST_INCREMENT));
if (!newData)
{
printf("重新分配空间错误!\n");
return FALSE;
}
list->data = newData;
list->listSize += LIST_INCREMENT;
}
for (int i = list->length; i >= index; i--)
{
list->data[i] = list->data[i - 1];
}
list->data[index - 1] = elem;
list->length += 1;
return TRUE;
}
Bool deleteElem(SQList *list, int index, Elemtype *elem)
{
if (index < 1 || index > list->length)
{
printf("删除位置错误:%d 不在[1,%d]的范围内!\n", index, list->length);
return FALSE;
}
if (elem)
{
*elem = list->data[index - 1];
}
for (int i = index - 1; i < list->length - 1; i++)
{
list->data[i] = list->data[i + 1];
}
list->length -= 1;
return TRUE;
}
void display(SQList *list)
{
printf("SQList[@%x]:\n", list);
if (list->length == 0)
{
printf("[-空表-]\n");
return;
}
for (int i = 0; i < list->length; i++)
{
if (i > 0)
{
printf("-> ");
}
printf("%d ", list->data[i]);
}
printf("\n");
}
int main(int argc, char const *argv[])
{
SQList *list = init();
int data[] = {5, 12, 45, 32, 1111, 33, 23, 455, 9, 0};
for (int i = 0; i < 10; i++)
{
insert(list, i + 1, data[i]);
}
display(list);
return 0;
}
DataStruct/SQList.java
package DataStruct;
import java.lang.reflect.Array;
import java.util.Arrays;
public class SQList<T> {
private static final int LIST_INIT_SIZE = 100;
private static final int LIST_INCREMENT = 10;
private T[] data;
private int length;
private int listSize;
@SuppressWarnings("unchecked")
public SQList(Class<T> type) {
data = (T[]) Array.newInstance(type, LIST_INIT_SIZE);
length = 0;
listSize = LIST_INIT_SIZE;
}
public SQList(Class<T> type, T[] arr) {
this(type);
for (int i = 0; i < arr.length; i++) {
insert(i + 1, arr[i]);
}
}
public int locate(T elem) {
for (int i = 0; i < length; i++) {
if (data[i] == elem) {
return i + 1;
}
}
return 0;
}
public T getElem(int index) throws IndexOutOfBoundsException {
if (index < 1 || index > length) {
throw new IndexOutOfBoundsException(String.format("位序越界:%d 不在[1,%d]的范围内!\n", index, length));
}
return data[index - 1];
}
public void insert(int index, T elem) throws IndexOutOfBoundsException {
if (index < 1 || index > length + 1) {
throw new IndexOutOfBoundsException(String.format("位序越界:%d 不在[1,%d]的范围内!\n", index, length));
}
if (length >= listSize) {
listSize += LIST_INCREMENT;
data = Arrays.copyOf(data, listSize);
}
for (int i = length; i >= index; i--) {
data[i] = data[i - 1];
}
data[index - 1] = elem;
length += 1;
}
public T delete(int index) throws IndexOutOfBoundsException {
if (index < 1 || index > length) {
throw new IndexOutOfBoundsException(String.format("位序越界:%d 不在[1,%d]的范围内!\n", index, length));
}
T deletedElem = data[index - 1];
for (int i = index - 1; i < length - 1; i++) {
data[i] = data[i + 1];
}
length -= 1;
return deletedElem;
}
public int getLength() {
return length;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(super.toString());
sb.append(":\n");
if (length == 0) {
sb.append("[-空表-]");
return sb.toString();
}
for (int i = 0; i < length; i++) {
if (i > 0) {
sb.append("-> ");
}
sb.append(data[i]);
sb.append(' ');
}
return sb.toString();
}
public static void main(String[] args) {
Integer[] data = { 5, 12, 45, 32, 1111, 33, 23, 455, 9, 0 };
SQList<Integer> list = new SQList<>(Integer.class, data);
System.out.println(list);
list.delete(4);
list.delete(6);
System.out.println(list);
System.out.println(list.locate(9));
System.out.println(list.getLength());
list.insert(3, 101);
System.out.println(list);
}
}
链表(链式存储结构)
LinkList.c
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef unsigned short Bool;
typedef int Elemtype;
typedef struct Node
{
Elemtype data;
Node *next;
} Node;
typedef struct
{
int length;
Node *next;
} LinkList;
Bool getElem(LinkList *head, int index, Elemtype *elem)
{
if (index < 1 || index > head->length)
{
printf("位序越界:%d 不在[1,%d]的范围内!\n", index, head->length);
return FALSE;
}
Node *node = head->next;
for (int i = 1; i < index; i++)
{
node = node->next;
}
if (elem)
{
*elem = node->data;
}
return TRUE;
}
int getLength(LinkList *head)
{
return head->length;
}
int locateElem(LinkList *head, Elemtype elem)
{
Node *node = head->next;
int index = 1;
while (node)
{
if (node->data == elem)
{
return index;
}
node = node->next;
index++;
}
return 0;
}
Bool insertElem(LinkList *head, int index, Elemtype elem)
{
if (index < 1 || index > head->length + 1)
{
printf("位序越界:%d 不在[1,%d]的范围内!\n", index, head->length);
return FALSE;
}
if (index == 1)
{
Node *node = (Node *)calloc(1, sizeof(Node));
if (!node)
{
printf("内存分配失败!\n");
return FALSE;
}
node->data = elem;
head->next = node;
head->length += 1;
return TRUE;
}
Node *node = head->next;
for (int i = 2; i < index; i++)
{
node = node->next;
}
Node *newNode = (Node *)calloc(1, sizeof(Node));
if (!newNode)
{
printf("内存分配失败!\n");
return FALSE;
}
newNode->data = elem;
newNode->next = node->next;
node->next = newNode;
head->length += 1;
return TRUE;
}
Bool deleteElem(LinkList *head, int index, Elemtype *elem)
{
if (index < 1 || index > head->length)
{
printf("位序越界:%d 不在[1,%d]的范围内!\n", index, head->length);
return FALSE;
}
if (index == 1)
{
Node *node = head->next;
if (elem)
{
*elem = node->data;
}
head->next = node->next;
free(node);
head->length -= 1;
return TRUE;
}
Node *node = head->next;
for (int i = 2; i < index; i++)
{
node = node->next;
}
Node *deletedNode = node->next;
if (elem)
{
*elem = deletedNode->data;
}
node->next = deletedNode->next;
free(deletedNode);
head->length -= 1;
return TRUE;
}
LinkList *createLink()
{
LinkList *head = (LinkList *)calloc(1, sizeof(LinkList));
if (!head)
{
printf("内存分配失败!\n");
}
return head;
}
LinkList *createLink(Elemtype *arr, int length)
{
LinkList *head = createLink();
if (!head)
{
return NULL;
}
for (int i = 1; i <= length; i++)
{
Bool result = insertElem(head, i, arr[i - 1]);
if (!result)
{
for (int j = i; j >= 1; j--)
{
deleteElem(head, j, NULL);
}
free(head);
return NULL;
}
}
return head;
}
void display(LinkList *head)
{
printf("LinkList[@%x]:\n", head);
Node *node = head->next;
if (!node)
{
printf("[-空表-]\n");
return;
}
printf("%d ", node->data);
node = node->next;
while (node)
{
printf("-> ");
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
int main(int argc, char const *argv[])
{
Elemtype arr[10] = {5, 12, 45, 32, 1111, 33, 23, 455, 9, 0};
LinkList *list = createLink(arr, 10);
display(list);
return 0;
}
DataStruct/LinkList.java
package DataStruct;
public class LinkList<T> {
private class Node {
T data;
Node next;
}
private int length;
private Node head;
public LinkList() {
length = 0;
head = null;
}
public LinkList(T[] arr) {
this();
for (int i = 1; i <= arr.length; i++) {
insert(i, arr[i - 1]);
}
}
public T getElem(int index) throws IndexOutOfBoundsException {
if (index < 1 || index > length) {
throw new IndexOutOfBoundsException(String.format("位序越界:%d 不在[1,%d]的范围内!\n", index, length));
}
Node node = head;
for (int i = 1; i < index; i++) {
if (node == null) {
throw new NullPointerException(String.format("链表内部出错!链表长度与实际不符:(%d < %d)\n", i, length));
}
node = node.next;
}
return node.data;
}
public int locate(T elem) {
Node node = head;
int index = 1;
while (node != null) {
if (node.data == elem) {
return index;
}
node = node.next;
index++;
}
return 0;
}
public void insert(int index, T elem) {
if (index < 1 || index > length + 1) {
throw new IndexOutOfBoundsException(String.format("位序越界:%d 不在[1,%d]的范围内!\n", index, length));
}
if (index == 1) {
head = new Node();
head.data = elem;
length += 1;
return;
}
Node node = head;
for (int i = 2; i < index; i++) {
if (node == null) {
throw new NullPointerException(String.format("链表内部出错!链表长度与实际不符:(%d < %d)\n", i, length));
}
node = node.next;
}
Node newNode = new Node();
newNode.data = elem;
newNode.next = node.next;
node.next = newNode;
length += 1;
}
public T delete(int index) {
if (index < 1 || index > length) {
throw new IndexOutOfBoundsException(String.format("位序越界:%d 不在[1,%d]的范围内!\n", index, length));
}
if (index == 1) {
Node node = head.next;
T deletedElem = node.data;
head.next = node.next;
length -= 1;
return deletedElem;
}
Node node = head;
for (int i = 2; i < index; i++) {
if (node == null) {
throw new NullPointerException(String.format("链表内部出错!链表长度与实际不符:(%d < %d)\n", i, length));
}
node = node.next;
}
Node deletedNode = node.next;
T deletedElem = deletedNode.data;
node.next = deletedNode.next;
length -= 1;
return deletedElem;
}
public int getLength() {
return length;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(super.toString());
sb.append(":\n");
Node node = head;
if (node == null) {
sb.append("[-空表-]");
return sb.toString();
}
sb.append(node.data);
sb.append(' ');
node = node.next;
while (node != null) {
sb.append("-> ");
sb.append(node.data);
sb.append(' ');
node = node.next;
}
return sb.toString();
}
public static void main(String[] args) {
Integer[] data = { 5, 12, 45, 32, 1111, 33, 23, 455, 9, 0 };
LinkList<Integer> list = new LinkList<>(data);
System.out.println(list);
list.delete(4);
list.delete(6);
System.out.println(list);
System.out.println(list.locate(9));
System.out.println(list.getLength());
list.insert(3, 101);
System.out.println(list);
}
}