#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct {
char* name;
int value;
}Elem;
Elem* createElem(char* name, int value);
bool alterElem(Elem* e, char* newName, int newValue);
bool copyElem(Elem* eCopy, Elem* e);
bool isSameElem(Elem* e1, Elem* e2);
void printElem(Elem* e);
typedef struct {
Elem** data;
int length;
int maxSize;
}SeqList;
SeqList* createList(int maxSize);
void releaseList(SeqList* list);
bool headInsertList(SeqList* list, Elem* e);
bool tailInsertList(SeqList* list, Elem* e);
bool insertList(SeqList* list, int pos, Elem* e);
bool headDeleteList(SeqList* list);
bool tailDeleteList(SeqList* list);
bool deleteList(SeqList* list, int index);
bool clearList(SeqList* list);
bool alterList(SeqList* list, int pos, char* newName, int newValue);
int locateElem(SeqList* list, char* name, int value);
Elem* getElem(SeqList* list, int pos);
bool isNotLegalPosition(SeqList* list, int pos);
bool isEmpty(SeqList* list);
bool isFull(SeqList* list);
int listLength(SeqList* list);
void printList(SeqList* list);
SeqList* mergeList(SeqList* list1, SeqList* list2);
SeqList* reverseList(SeqList* list);
SeqList* reversePartList(SeqList* list, int startPos, int endPos);
int sameElemCount(SeqList* list1, SeqList* list2);
bool alterListFromOther(SeqList* list, int pos, SeqList* otherList, int otherPos);
void main() {
SeqList* list = createList(100);
printf("/*************************************************增*************************************************/\n");
headInsertList(list, createElem("a", 1));
printf("头插法插入元素:(a,1),操作后表为:");printList(list);
insertList(list, 2, createElem("b", 2));
printf("在第二个位置插入元素:(b,2),操作后表为:");printList(list);
insertList(list, 3, createElem("c", 3));
printf("在第三个位置插入元素:(c,3),操作后表为:");printList(list);
tailInsertList(list, createElem("d", 4));
printf("尾插法插入元素:(d,4),操作后表为:");printList(list);
printf("顺序表的长度为:%d\n",listLength(list));
printf("/*************************************************查*************************************************/\n");
printf("元素(c,3)在顺序表中的位置为:%d\n", locateElem(list, "c", 3));
printf("顺序表中第2个元素为:"); printElem(getElem(list, 2)); printf("\n");
printf("/*************************************************改*************************************************/\n");
alterList(list, 4, "x", 100);
printf("修改顺序表中第4个元素的值为(x, 100),操作后表为:"); printList(list);
printf("/*************************************************删*************************************************/\n");
headDeleteList(list);
printf("头删法删除元素,操作后表为:");printList(list);
deleteList(list, 2);
printf("删除第2个元素,操作后表为:");printList(list);
tailDeleteList(list);
printf("尾删法删除元素,操作后表为:");printList(list);
clearList(list);
printf("清空顺序表,操作后表为:");printList(list);
printf("顺序表的长度为:%d\n",listLength(list));
releaseList(list);
printf("/*************************************************其它*************************************************/\n");
printf("表1:(a,1) (b,2) (c,3);");
SeqList* list1 = createList(100);
tailInsertList(list1, createElem("a", 1));
tailInsertList(list1, createElem("b", 2));
tailInsertList(list1, createElem("c", 3));
printf("表2:(c,3) (d,4) (e,5); ");
SeqList* list2 = createList(100);
tailInsertList(list2, createElem("c", 3));
tailInsertList(list2, createElem("d", 4));
tailInsertList(list2, createElem("e", 5));
printf("表1和表2相同元素个数为:%d", sameElemCount(list1, list2));
SeqList* list12 = mergeList(list1, list2);
printf("\n合并后:"); printList(list12);
SeqList* list21 = reverseList(list12); printf("反转所有元素,反转后:"); printList(list21);
printf("将合并表的第3个元素设置位反转表的第2个元素,设置后合并表为:"); alterListFromOther(list12, 3, list21, 2); printList(list12);
printf("合并表和反转表相同元素个数为:%d\n", sameElemCount(list12, list21));
SeqList* list21_part = reversePartList(list12, 2, 5);
printf("反转第2到第5的元素,反转后:"); printList(list21_part); printf("\n");
releaseList(list1);
releaseList(list2);
releaseList(list12);
releaseList(list21);
releaseList(list21_part);
}
Elem* createElem(char* name, int value) {
Elem* e = (Elem*) malloc(sizeof(Elem));
if(e == NULL) {
printf("创建元素失败!\n");
return NULL;
}
e->name = (char*) malloc(sizeof(char)*(strlen(name)+1));
strcpy(e->name, name);
e->value = value;
return e;
}
bool alterElem(Elem* e, char* newName, int newValue) {
if(e == NULL || newName == NULL) {
return false;
}
free(e->name);
e->name = (char* ) malloc(sizeof(char)*(strlen(newName)+1));
strcpy(e->name, newName);
e->value = newValue;
return true;
}
bool copyElem(Elem* eCopy, Elem* e) {
eCopy->name = (char*) malloc(sizeof(char)*(strlen(e->name)+1));
if(eCopy->name == NULL) {
return NULL;
}
strcpy(eCopy->name, e->name);
eCopy->value = e->value;
return true;
}
bool isSameElem(Elem* e1, Elem* e2) {
if(e1 == NULL || e2 == NULL) {
return false;
}
return strcmp(e1->name, e2->name) == 0 ? e1->value == e2->value : false;
}
void printElem(Elem* e) {
printf("(%s, %d)", e->name, e->value);
}
SeqList* createList(int maxSize) {
SeqList* list = (SeqList *) malloc(sizeof(SeqList));
list->data = (Elem **) malloc(sizeof(Elem*) * maxSize);
for(int i = 0; i < maxSize; i++) {
list->data[i] = (Elem*) malloc(sizeof(Elem));
}
list->length = 0;
list->maxSize = maxSize;
return list;
}
void releaseList(SeqList* list) {
for(int i = 0; i < list->length; i ++) {
free(list->data[i]->name);
free(list->data[i]);
}
free(list->data);
free(list);
}
bool headInsertList(SeqList* list, Elem* e) {
if(isFull(list)) {
return false;
}
for(int i = list->length-1; i >= 0; i--) {
list->data[i+1] = list->data[i];
}
list->data[0] = e;
list->length += 1;
return true;
}
bool headDeleteList(SeqList* list) {
if(isEmpty(list)) {
return false;
}
free(list->data[0]);
for(int i = 1; i < list->length; i ++) {
list->data[i-1] = list->data[i];
}
list->length -= 1;
return true;
}
bool tailInsertList(SeqList* list, Elem* e) {
if(isFull(list)) {
return false;
}
list->data[list->length] = e;
list->length += 1;
return true;
}
bool tailDeleteList(SeqList* list) {
if(isEmpty(list)) {
return false;
}
free(list->data[list->length-1]);
list->length -= 1;
return true;
}
bool insertList(SeqList* list, int pos, Elem* e) {
if(isNotLegalPosition(list, pos)) {
return false;
}
if(isFull(list)) {
return false;
}
int i;
for(i = list->length-1; i >= pos-1; i--) {
list->data[i+1] = list->data[i];
}
list->data[pos-1] = e;
list->length += 1;
return true;
}
bool deleteList(SeqList* list, int pos) {
if(isNotLegalPosition(list, pos)) {
return false;
}
if(isEmpty(list)) {
return false;
}
free(list->data[pos-1]);
for(int i = pos; i < list->length; i++) {
list->data[i-1] = list->data[i];
}
list->length -= 1;
return true;
}
bool clearList(SeqList* list) {
if(isEmpty(list)) {
return true;
}
for(int i = 0; i < list->length; i++) {
free(list->data[i]);
}
list->length = 0;
return true;
}
bool alterList(SeqList* list, int pos, char* newName, int newValue) {
if(isNotLegalPosition(list, pos)) {
return false;
}
if(isEmpty(list)) {
return false;
}
return alterElem(list->data[pos-1], newName, newValue);
}
int locateElem(SeqList* list, char* name, int value) {
if(isEmpty(list)) {
return -1;
}
int result = -1;
for(int i = 0; i < list->length; i++) {
if(strcmp(list->data[i]->name, name) == 0
&& list->data[i]->value == value) {
result = i+1;
break;
}
}
return result;
}
Elem* getElem(SeqList* list, int pos) {
if(isNotLegalPosition(list, pos)) {
return NULL;
}
return list->data[pos-1];
}
bool isNotLegalPosition(SeqList* list, int pos) {
if(pos-1 < 0 || pos-1 > list->length) {
return true;
}else {
return false;
}
}
bool isEmpty(SeqList* list) {
if(list->length == 0) {
return true;
}else {
return false;
}
}
bool isFull(SeqList* list) {
if(list->length >= list->maxSize) {
return true;
} else {
return false;
}
}
int listLength(SeqList* list) {
return list->length;
}
void printList(SeqList* list) {
for(int i = 0; i < list->length; i++) {
printElem(list->data[i]);
printf(" ");
}
printf("\n");
}
SeqList* mergeList(SeqList* list1, SeqList* list2) {
SeqList* newList = createList(list1->maxSize + list2->maxSize);
newList->length = list1->length + list2->length;
int i;
for(i = 0; i < list1->length; i++) {
copyElem(newList->data[i], list1->data[i]);
}
for(i = list1->length; i < newList->length; i++) {
copyElem(newList->data[i], list2->data[i - list1->length]);
}
return newList;
}
SeqList* reverseList(SeqList* list) {
SeqList* newList = createList(list->maxSize);
if(newList == NULL) {
return NULL;
}
newList->length = list->length;
for(int i = 0; i < list->length; i++) {
copyElem(newList->data[i], list->data[list->length - i -1]);
}
return newList;
}
SeqList* reversePartList(SeqList* list, int startPos, int endPos) {
SeqList* newList = createList(list->maxSize);
if(newList == NULL) {
return NULL;
}
if(startPos < 1 || endPos > list->length) {
return NULL;
}
newList->length = list->length;
int i;
for(i = 0; i <= startPos - 2; i ++) {
copyElem(newList->data[i], list->data[i]);
}
for(i = startPos - 1; i <= endPos - 1; i++) {
copyElem(newList->data[i], list->data[(endPos -1) + (startPos - 1) - i]);
}
for(i = endPos; i < list->length; i++) {
copyElem(newList->data[i], list->data[i]);
}
return newList;
}
int sameElemCount(SeqList* list1, SeqList* list2) {
int count = 0;
for(int i = 0; i < list1->length; i++) {
for(int j = 0; j < list2->length; j++) {
if(isSameElem(list1->data[i], list2->data[j])) {
count += 1;
break;
}
}
}
return count;
}
bool alterListFromOther(SeqList* list, int pos, SeqList* otherList, int otherPos) {
if(list == NULL || otherList == NULL) {
return false;
}
if(isNotLegalPosition(list, pos) || isNotLegalPosition(otherList, otherPos)) {
return false;
}
alterElem(list->data[pos -1], otherList->data[otherPos - 1]->name, otherList->data[otherPos -1]->value);
return true;
}
结果:
头插法插入元素:(a,1),操作后表为:(a, 1)
在第二个位置插入元素:(b,2),操作后表为:(a, 1) (b, 2)
在第三个位置插入元素:(c,3),操作后表为:(a, 1) (b, 2) (c, 3)
尾插法插入元素:(d,4),操作后表为:(a, 1) (b, 2) (c, 3) (d, 4)
顺序表的长度为:4
元素(c,3)在顺序表中的位置为:3
顺序表中第2个元素为:(b, 2)
修改顺序表中第4个元素的值为(x, 100),操作后表为:(a, 1) (b, 2) (c, 3) (x, 100)
头删法删除元素,操作后表为:(b, 2) (c, 3) (x, 100)
删除第2个元素,操作后表为:(b, 2) (x, 100)
尾删法删除元素,操作后表为:(b, 2)
清空顺序表,操作后表为:
顺序表的长度为:0
表1:(a,1) (b,2) (c,3);表2:(c,3) (d,4) (e,5); 表1和表2相同元素个数为:1
合并后:(a, 1) (b, 2) (c, 3) (c, 3) (d, 4) (e, 5)
反转所有元素,反转后:(e, 5) (d, 4) (c, 3) (c, 3) (b, 2) (a, 1)
将合并表的第3个元素设置位反转表的第2个元素,设置后合并表为:(a, 1) (b, 2) (d, 4) (c, 3) (d, 4) (e, 5)
合并表和反转表相同元素个数为:6
反转第2到第5的元素,反转后:(a, 1) (d, 4) (c, 3) (d, 4) (b, 2) (e, 5)