顺序表的创建
//顺序表的创建
typedef struct Stu
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char major[MAJOR_MAX];
float GPA;
}Stu;
typedef struct SeqList
{
Stu* p;
int size;
int capacity;
}SeqList;
2. 顺序表的初始化
//顺序表的初始化
void SeqListInit(SeqList* ps)
{
assert(ps);
ps->p = (Stu*)malloc(sizeof(Stu) * INIT_CAPACITY);
if (ps->p == NULL)
{
perror("SeqListInit::Malloc");
return;
}
ps->size = 0;
ps->capacity = INIT_CAPACITY;
}
3. 顺序表的销毁
//顺序表的销毁
void SeqListDestroy(SeqList* ps)
{
assert(ps);
free(ps->p);
ps->p = NULL;
ps->size = 0;
ps->capacity = 0;
}
4. 顺序表的打印
//顺序表的打印
void SeqListPrint(SeqList* ps)
{
assert(ps);
for (int i = 0; i < ps->size; i++)
{
printf("%-10s %-10s %-10d %-10s %.2f\n", (ps->p + i)->name, (ps->p + i)->sex, (ps->p + i)->age, (ps->p + i)->major, (ps->p + i)->GPA);
}
}
5. 顺序表的插入(尾插)
//顺序表的插入(尾插)
void SeqListPushBack(SeqList* ps)
{
assert(ps);
if (ps->size == ps->capacity)
{
Stu* pp = (Stu*)realloc(ps->p, sizeof(Stu) * (ps->capacity) * 2);
if (pp == NULL)
{
perror("SeqListPushBack::Realloc");
return;
}
ps->p = pp;
ps->capacity *= 2;
}
scanf("%s %s %d %s %f", (ps->p + ps->size)->name, (ps->p + ps->size)->sex, &((ps->p + ps->size)->age), (ps->p + ps->size)->major, &((ps->p + ps->size)->GPA));
ps->size++;
}
6. 顺序表的插入(头插)
//顺序表的插入(头插)
void SeqListPushFront(SeqList* ps)
{
assert(ps);
if (ps->size == ps->capacity)
{
Stu* pp = (Stu*)realloc(ps->p, sizeof(Stu) * (ps->capacity) * 2);
if (pp == NULL)
{
perror("SeqListPushBack::Realloc");
return;
}
ps->p = pp;
ps->capacity *= 2;
}
for (int i = ps->size; i >= 1; i--)
{
memmove(ps->p + i, ps->p + i - 1, sizeof(Stu));
}
scanf("%s %s %d %s %f", (ps->p)->name, (ps->p)->sex, &((ps->p)->age), (ps->p)->major, &((ps->p)->GPA));
ps->size++;
}
7. 顺序表的插入(在第pos个位置后面插入)
//顺序表的插入(在第pos个位置后插入)
void SeqListPushPos(SeqList* ps)
{
assert(ps);
if (ps->size == ps->capacity)
{
Stu* pp = (Stu*)realloc(ps->p, sizeof(Stu) * (ps->capacity) * 2);
if (pp == NULL)
{
perror("SeqListPushBack::Realloc");
return;
}
ps->p = pp;
ps->capacity *= 2;
}
int pos = 0;
scanf("%d", &pos);
for (int i = ps->size; i >= pos + 1; i--)
{
memmove(ps->p + i, ps->p + i - 1, sizeof(Stu));
}
scanf("%s %s %d %s %f", (ps->p + pos)->name, (ps->p + pos)->sex, &((ps->p + pos)->age), (ps->p + pos)->major, &((ps->p + pos)->GPA));
ps->size++;
}
8. 顺序表的删除(尾删)
//顺序表的删除(尾删)
void SeqListPopBack(SeqList* ps)
{
assert(ps);
assert(ps->size > 0);
ps->size--;
}
9. 顺序表的删除(头删)
//顺序表的删除(头删)
void SeqListPopFront(SeqList* ps)
{
assert(ps);
assert(ps->size > 0);
for (int i = 0; i < ps->size - 1; i++)
{
memmove(ps->p + i, ps->p + i + 1, sizeof(Stu));
}
ps->size--;
}
10. 顺序表的删除(删除第pos个元素)
//顺序表的删除(删除第pos个元素)
void SeqListPopPos(SeqList* ps)
{
assert(ps);
assert(ps->size > 0);
int pos = 0;
scanf("%d", &pos);
for (int i = pos - 1; i < ps->size - 1; i++)
{
memmove(ps->p + i, ps->p + i + 1, sizeof(Stu));
}
ps->size--;
}
11. 顺序表内元素的查找
//顺序表的查找(输入索引信息)
void SeqListFind(SeqList* ps)
{
assert(ps);
char inputname[NAME_MAX] = { 0 };
scanf("%s", inputname);
for (int i = 0; i < ps->size; i++)
{
if (strcmp(inputname, (ps->p + i)->name) == 0)
{
printf("%-10s %-10s %-10d %-10s %.2f\n", (ps->p + i)->name, (ps->p + i)->sex, (ps->p + i)->age, (ps->p + i)->major, (ps->p + i)->GPA);
break;
}
}
}
完整的一个用顺序表的例子
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define NAME_MAX 20
#define SEX_MAX 10
#define MAJOR_MAX 20
#define INIT_CAPACITY 5
//顺序表的创建
typedef struct Stu
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char major[MAJOR_MAX];
float GPA;
}Stu;
typedef struct SeqList
{
Stu* p;
int size;
int capacity;
}SeqList;
//顺序表的初始化
void SeqListInit(SeqList* ps)
{
assert(ps);
ps->p = (Stu*)malloc(sizeof(Stu) * INIT_CAPACITY);
if (ps->p == NULL)
{
perror("SeqListInit::Malloc");
return;
}
ps->size = 0;
ps->capacity = INIT_CAPACITY;
}
//顺序表的销毁
void SeqListDestroy(SeqList* ps)
{
assert(ps);
free(ps->p);
ps->p = NULL;
ps->size = 0;
ps->capacity = 0;
}
//顺序表的打印
void SeqListPrint(SeqList* ps)
{
assert(ps);
for (int i = 0; i < ps->size; i++)
{
printf("%-10s %-10s %-10d %-10s %.2f\n", (ps->p + i)->name, (ps->p + i)->sex, (ps->p + i)->age, (ps->p + i)->major, (ps->p + i)->GPA);
}
}
//顺序表的插入(尾插)
void SeqListPushBack(SeqList* ps)
{
assert(ps);
if (ps->size == ps->capacity)
{
Stu* pp = (Stu*)realloc(ps->p, sizeof(Stu) * (ps->capacity) * 2);
if (pp == NULL)
{
perror("SeqListPushBack::Realloc");
return;
}
ps->p = pp;
ps->capacity *= 2;
}
scanf("%s %s %d %s %f", (ps->p + ps->size)->name, (ps->p + ps->size)->sex, &((ps->p + ps->size)->age), (ps->p + ps->size)->major, &((ps->p + ps->size)->GPA));
ps->size++;
}
//顺序表的插入(头插)
void SeqListPushFront(SeqList* ps)
{
assert(ps);
if (ps->size == ps->capacity)
{
Stu* pp = (Stu*)realloc(ps->p, sizeof(Stu) * (ps->capacity) * 2);
if (pp == NULL)
{
perror("SeqListPushBack::Realloc");
return;
}
ps->p = pp;
ps->capacity *= 2;
}
for (int i = ps->size; i >= 1; i--)
{
memmove(ps->p + i, ps->p + i - 1, sizeof(Stu));
}
scanf("%s %s %d %s %f", (ps->p)->name, (ps->p)->sex, &((ps->p)->age), (ps->p)->major, &((ps->p)->GPA));
ps->size++;
}
//顺序表的插入(在第pos个位置后插入)
void SeqListPushPos(SeqList* ps)
{
assert(ps);
if (ps->size == ps->capacity)
{
Stu* pp = (Stu*)realloc(ps->p, sizeof(Stu) * (ps->capacity) * 2);
if (pp == NULL)
{
perror("SeqListPushBack::Realloc");
return;
}
ps->p = pp;
ps->capacity *= 2;
}
int pos = 0;
scanf("%d", &pos);
for (int i = ps->size; i >= pos + 1; i--)
{
memmove(ps->p + i, ps->p + i - 1, sizeof(Stu));
}
scanf("%s %s %d %s %f", (ps->p + pos)->name, (ps->p + pos)->sex, &((ps->p + pos)->age), (ps->p + pos)->major, &((ps->p + pos)->GPA));
ps->size++;
}
//顺序表的删除(尾删)
void SeqListPopBack(SeqList* ps)
{
assert(ps);
assert(ps->size > 0);
ps->size--;
}
//顺序表的删除(头删)
void SeqListPopFront(SeqList* ps)
{
assert(ps);
assert(ps->size > 0);
for (int i = 0; i < ps->size - 1; i++)
{
memmove(ps->p + i, ps->p + i + 1, sizeof(Stu));
}
ps->size--;
}
//顺序表的删除(删除第pos个元素)
void SeqListPopPos(SeqList* ps)
{
assert(ps);
assert(ps->size > 0);
int pos = 0;
scanf("%d", &pos);
for (int i = pos - 1; i < ps->size - 1; i++)
{
memmove(ps->p + i, ps->p + i + 1, sizeof(Stu));
}
ps->size--;
}
//顺序表的查找(输入索引信息)
void SeqListFind(SeqList* ps)
{
assert(ps);
char inputname[NAME_MAX] = { 0 };
scanf("%s", inputname);
for (int i = 0; i < ps->size; i++)
{
if (strcmp(inputname, (ps->p + i)->name) == 0)
{
printf("%-10s %-10s %-10d %-10s %.2f\n", (ps->p + i)->name, (ps->p + i)->sex, (ps->p + i)->age, (ps->p + i)->major, (ps->p + i)->GPA);
break;
}
}
}
//菜单
void menu()
{
printf("***************************** \n");
printf("1. 头插 2. 尾插 3. 自由插\n");
printf("4. 头删 5. 尾删 6. 自由删\n");
printf("7. 查找 8. 打印 0. 退出 \n");
printf("*****************************\n");
}
int main()
{
SeqList SL;
SeqList* ps = &SL;
int input = 0;
SeqListInit(ps);
do
{
menu();
scanf("%d",&input);
switch (input)
{
case 1:
SeqListPushFront(ps);
break;
case 2:
SeqListPushBack(ps);
break;
case 3:
SeqListPushPos(ps);
break;
case 4:
SeqListPopFront(ps);
break;
case 5:
SeqListPopBack(ps);
break;
case 6:
SeqListPopPos(ps);
break;
case 7:
SeqListFind(ps);
break;
case 8:
SeqListPrint(ps);
break;
case 0:
break;
default:
printf("请重新输入:");
}
} while (input);
return 0;
}