一.顺序表
#include <stdio.h>
#define maxsize 100
#include <stdlib.h>
#define error 0
#define ok 1
typedef int elemtype;
elemtype elem[maxsize];
int length;
}sqlist;
typedef struct {
sqlist* creatlist() //初始化
{
sqlist* L;
L = (sqlist*)malloc(sizeof(sqlist));//在内存上腾出一个空间
if (!L)
return NULL;
else {
L->length = 0;
return L;
}
}
void assignsqlist(sqlist * L) //顺序表赋值(sqlist * L:指向顺序表地址)
{
int i;
printf("请输入元素个数:");
scanf_s("%d", &L->length);
printf("按照元素个数依次输入元素值:");
for (i = 0; i < L->length; i++)
scanf_s("%d", &L->elem[i]);
}
void outputsqlist(sqlist* L) //输出
{
int i;
printf("顺序表的长度是%d\n", L->length);
printf("顺序表的元素依次是:");
for (i = 0; i < L->length; i++)
printf("%4d", L->elem[i]);
printf("\n");
}
int insertsqlist(sqlist* L, int i, elemtype e) //插入
{
int j;
if (i<1 || i>L->length + 1)
return error;
if (L->length >= maxsize) {
printf("线性表溢出\n");
return error;
}
for (j = L->length - 1; j >= i - 1; --j)
L->elem[j + 1] = L->elem[j];
L->elem[i - 1] = e;
L->length++;
return ok;
}
int deletesqlist(sqlist* L, int i) //删除
{
int j;
if (i<1 || i>L->length)
return error;
if (L->length <= 0) {
printf("线性表为空\n");
return error;
}
for (j = i; j <= L->length - 1; ++j)
L->elem[j - 1] = L->elem[j];
L->length--;
return ok;
}
int getData(sqlist *L, int i) { //按照元素位查询
if (i<1 || i>L->length)
{
printf("顺序表越界!\n");
exit(0);
}
return ok;
}
int locate(sqlist* L, int e) {
int i = 0;
while (i <= L->length && L->elem[i] != e) {
i++;
}
if (i <L->length && L->elem[i] == e)
{
return i + 1;
}
return -1;
}
int main() {
sqlist * L = nullptr;
int k, i, e;
do
{
printf("\n\n\n\n");
printf("\t\t\t 链表子系统\n");
printf("\t\t*******************************\n");
printf("\t\t* 1----初 始 化 *\n");
printf("\t\t* 2----赋 值 *\n");
printf("\t\t* 3----删 除 *\n");
printf("\t\t* 4----插 入 *\n");
printf("\t\t* 5----显 示 *\n");
printf("\t\t* 6----按下标查询 *\n");
printf("\t\t* 7----按元素查询 *\n");
printf("\t\t* 0----返 回 *\n");
printf("\t\t*******************************\n");
printf("\t\t 请选择菜单项(0-7):");
scanf_s("%d", &k); //getchar();
switch (k)
{
case 1:
L = creatlist();
if (L == NULL) printf("初始化顺序表失败\n");
else printf("初始化顺序表成功\n");
break;
case 2:
assignsqlist(L);
outputsqlist(L);
break;
case 3:
printf("请输入删除元素的位置:");
scanf_s("%d", &i);
k = deletesqlist(L, i);
if (k == 1)
{
printf("删除操作成功,删除元素后顺序表如下\n");
outputsqlist(L);
}
else printf("删除操作失败\n");
break;
case 4:
printf("请输入插入位置和插入数据:");
scanf_s("%d%d", &i, &e);
k = insertsqlist(L, i, e);
if (k == 1) {
printf("插入操作成功!插入元素后顺序表如下\n");
outputsqlist(L);
}
else printf("插入操作失败\n");
break;
case 5:
outputsqlist(L);
break;
case 6:
printf("请输入要查找的元素:");
scanf_s("%d", &e);
getData(L ,e);
printf("你查找的下标是:%d",L->elem[e-1]);
break;
case 7:
int index;
printf("你输入查找的元素:");
scanf_s("%d",&e);
index = locate(L,e);
printf("你查找的元素%d在第%d的位置。\n",e,index);
break;
case 0:
exit(0);
break;
}
} while (k != 0);
system("pause");//
return 0;
}
二.链表设计
#include <stdio.h>
#include <stdlib.h>
typedef int elemtype;
typedef struct Node {
elemtype data;
struct Node* next;
}linknode, * linklist;
linklist init_linklist() {
linklist l;
l = (linklist)malloc(sizeof(linknode));
l->next = NULL;
return l;
}
linklist Creat_LinkList_1() //尾插入法建立单链表算法
{
linklist head, rear; //头指针,尾指针
head = (linklist)malloc(sizeof(linknode));
head ->next = NULL;
rear = head;
linknode *s; //定义一个待插入结点数据类型
elemtype x; //设待插入数据元素的类型为int
printf("请输入每个结点的值域(0结束): ");
scanf_s("%d", &x);
while (x != 0) //当输入的值不为0时,进入循环
{
s = (linklist)malloc(sizeof(linknode)); //申请新结点
s->data = x; //对新结点赋值
s->next = rear->next;
rear->next = s;
rear = s;
scanf_s("%d", &x); //输入新数据
}
return head;
}
/*单链表的查找--按序号查找(运用的是尾插法)
在单链表L中查找第i个元素结点,找到返回其指针,否则返回空*/
linknode* locatenode(linklist head, elemtype i)
{
linknode *p;
int j = 0; //将头结点的位置设为0
p = head;
while (p && j < i)
{
p = p->next;
j++;
}
if (j == i)
return p;
else
return NULL;
}
/*单链表的查找--按值查找(运用的是尾插法)
在单链表L中查找第i个元素结点,找到返回其指针,否则返回空*/
linknode* locatenode_1(linklist head, elemtype x) {
linknode* p;
p = head->next;
while (p && p->data != x)
p = p->next;
return p;
}
/*插入运算 Insert_LinkList(L,i,x) 头结点前不能插入结点
在单链表L的第i个位置上插入值为x的元素*/
linklist insert_linklist(linklist L, int i, elemtype x)
{
linknode * p, * s;
int j = 0; //设头结点的位置为0
p = L;
while (p && j < i - 1) //p指向第i-1个结点
{
p = p->next;
j++;
}
if (p == NULL) {
printf("插入位置失败\n");
return NULL;
}
else {
s = (linknode *)malloc(sizeof(linklist));
s->data = x;
s->next = p->next;
p->next = s;
return p;
}
}
/*删除运算 删除单链表L的第i个位置上的元素*/
int del_linklist(linklist L, elemtype i)
{
linknode* p, * s;
elemtype x;
p = L;
s = locatenode(p, i - 1);
if (s == NULL)
{
printf("第i-1个结点不存在");
return 0;
}
else if (s->next == NULL)
{
printf("第i个结点不存在");
return 0;
}
else
{
p = s->next;
s->next = p->next;
x = p->data;
free(p);
return x;
}
}
void outputnode(linklist L) //输出单链表
{
linknode* p;
p = L->next; //指向头结点后的第一个结点
while (p->next != NULL)
{
printf("%d->", p->data); //输出表中非最后一个元素
p = p->next;
}
printf("%d\n", p->data); //输出表中最后一个元素
}
int main() {
linklist L;
L = init_linklist();
int i, e, k;
linknode* p;
elemtype x;
do
{
printf("\n\n\n\n");
printf("\t\t\t 链表子系统\n");
printf("\t\t*********************************\n");
printf("\t\t* 1----初 始 化 *\n");
printf("\t\t* 2----赋 值 *\n");
printf("\t\t* 3----插 入 *\n");
printf("\t\t* 4----删 除 *\n");
printf("\t\t* 5----显 示 *\n");
printf("\t\t* 6----按序号查询 *\n");
printf("\t\t* 7----按值 查询 *\n");
printf("\t\t* 0----返 回 *\n");
printf("\t\t*********************************\n");
printf("\t\t 请选择菜单项(0-7):");
scanf_s("%d", &k); //getchar();
switch (k)
{
case 1:
L = init_linklist();
if (L == NULL) printf("初始化顺序表失败\n");
else printf("初始化顺序表成功\n");
break;
case 2:
L = Creat_LinkList_1();
printf("表的存储顺序为:");
outputnode(L);
break;
case 3:
printf("请输入插入位置和插入数据:");
scanf_s("%d%d", &i, &e);
p = insert_linklist(L, i, e);
if (p != NULL) {
printf("插入操作成功!插入元素后顺序表如下\n");
outputnode(L);
}
else printf("插入操作失败\n");
break;
case 4:
printf("请输入删除元素的位置:");
scanf_s("%d", &i);
k = del_linklist(L, i);
if (k == 0)
printf("删除失败\n");
else
{
printf("删除成功\n");
printf("删除元素值为 %d\n", k);
printf("删除后链表存储顺序为:");
outputnode(L);
}
break;
case 5:
printf("表的存储顺序为:");
outputnode(L);
break;
case 6:
L = Creat_LinkList_1();
printf("请输入要查找的序号i(头结点的序号为0):"); //头结点的序号为0
scanf_s("%d", &i);
p = locatenode(L, i);
if (p == NULL)
printf("查询失败,没有此元素\n");
else
printf("查询成功\n");
outputnode(L);
printf("中序号为 %d 的值是 %d ", i, p->data);
break;
case 7:
L = Creat_LinkList_1();
printf("请输入待查找的元素值:");
scanf_s("%d", &x);
p = locatenode_1(L , x);
if (p == NULL)
printf("查询失败,没有此元素\n");
else
printf("查询成功\n");
break;
}
} while (k != 0);
return 0;
}
注意:代码框架不是为我所有,但是核心代码的编写是自己参考实例实现。