1.线性表的顺序存储
#include <stdio.h>
#define MAXLEN 100
typedef int DataType;
typedef struct {
DataType data[MAXLEN];
int Length;
} SeqList;
SeqList L;
void InitList(SeqList *L) {
L->Length = 0;
}
void CreateList(SeqList *L, int n) {
int i;
printf("请输入%d个整数:", n);
for (i = 0; i < n; i++)
scanf("%d", &L->data[i]);
L->Length = i;
}
int GetElem(SeqList *L, int i, DataType *x) {
if (i < 1 || i > L->Length)
return 0;
else {
*x = L->data[i - 1];
return 1;
}
}
int Locate(SeqList *L, DataType x) {
int i = 0;
while (i < L->Length && L->data[i] != x)
i++;
if (i >= L->Length)
return 0;
else
return i + 1;
}
int InsElem(SeqList *L, int i, DataType x) {
int j;
if (L->Length >= MAXLEN) {
printf("顺序表已满!");
return -1;
}
if (i < 1 || i > L->Length + 1) {
printf("插入位置出错!");
return 0;
}
if (i == L->Length + 1) {
L->data[i - 1] = x;
L->Length++;
return 1;
}
for (j = L->Length - 1; j >= i - 1; j--)
L->data[j + 1] = L->data[j];
L->data[i - 1] = x;
L->Length++;
return 1;
}
int DelElem(SeqList *L, int i, DataType *x) {
int j;
if (L->Length == 0) {
printf("顺序表为空!");
return 0;
}
if (i < 1 || i > L->Length) {
printf("不存在第i个元素");
return 0;
}
*x = L->data[i - 1];
for (j = i; j < L->Length; j++)
L->data[j - 1] = L->data[j];
L->Length--;
return 1;
}
void DispList(SeqList *L) {
int i;
for (i = 0; i < L->Length; i++)
printf("%5d", L->data[i]);
}
void Menu() {
printf("\n请选择对顺序表的各种操作:");
printf("\n***********************************************");
printf("\n 1---建立顺序表 ");
printf("\n 2---插入元素 ");
printf("\n 3---删除元素 ");
printf("\n 4---按位置查找元素 ");
printf("\n 5---按元素值查找其在表中位置 ");
printf("\n 6---求顺序表的长度 ");
printf("\n 0---返回 ");
printf("\n***********************************************");
printf("\n请输入菜单号(0-6):");
}
int main() {
SeqList L;
DataType x;
int n, i, loc;
char ch1, ch2, a;
ch1 = 'y';
while (ch1 == 'y' || ch1 == 'Y') {
Menu();
scanf("%c", &ch2);
getchar();
switch (ch2) {
case'1':
InitList(&L);
printf("请输入创建线性表的个数:");
scanf("%d", &n);
CreateList(&L, n);
printf("建立的线性表为:");
DispList(&L);
break;
case'2':
printf("请输入要插入的位置:");
scanf("%d", &i);
printf("请输入要插入的元素值:");
scanf("%d", &x);
if (InsElem(&L, i, x)) {
printf("已成功在第%d的位置上插入%d,插入后的线性表为:\n", i, x);
DispList;
} else
printf("输入插入的参数错误!");
break;
case '3':
printf("请输入要删除元素的位置:");
scanf("%d", &i);
if (DelElem(&L, i, &x)) {
printf("已成功在第%d的位置上删除%d,删除后的线性表为:\n", i, x);
DispList(&L);
} else
printf("\n输入删除的参数错误!");
break;
case '4':
printf("请输入要查看表中元素位置(从1开始):");
scanf("%d", &i);
if (GetElem(&L, i, &x))
printf("线性表第%d个元素的值为:%d", i, x);
else
printf("输入的位置错误!");
break;
case '5':
printf("请输入要查找的元素值为:");
scanf("%d", &x);
loc = Locate(&L, x);
if (loc)
printf("查找元素值为%d的位置为:%d", x, loc);
else
printf("该表中无此元素!");
break;
case '6':
printf("当前线性表的长度为:%d", L.Length);
break;
case '0':
ch1 = 'n';
break;
default:
printf("输入有误,请输入0~6进行选择!");
}
if (ch2 != '0') {
printf("\n按回车健继续,按任意键返回主菜单!\n");
a = getchar(
);
if (a != '\xA') {
getchar();
ch1 = 'n';
}
}
}
}
2.线性表子系统
/*线性表子系统*/
#include <stdio.h>
#include <malloc.h>
typedef int DataType; /*定义DataType为int类型*/
typedef struct linknode { /*单链表存储类型*/
DataType data; /*定义结点的数据域*/
struct linknode *next; /*定义结点的指针域*/
} LinkList;
LinkList *InitList() {
/*初始化链表函数*/
LinkList *head;
head = (LinkList *)malloc(sizeof(LinkList)); /*动态分配一个结点空间*/
head->next = NULL;
return head; /*头结点L指针域为空,表示空链表*/
}
void CreateListH(LinkList *head, int n) {
/*头插法建立链表函数*/
LinkList *s;
int i;
printf("请输入%d个整数:", n);
for (i = 0; i < n; i++) {
s = (LinkList *)malloc(sizeof(LinkList)); /*生成新结点*/
scanf("%d", &s->data); /*读入新结点的数据域*/
s->next = head->next; /*将新结点的指针域存放头结点的指针域*/
head->next = s; /*将新结点插入头结点之后*/
}
printf("建立链表操作成功!");
}
void CreateListL(LinkList *head, int n) {
/*尾插法建立链表函数*/
LinkList *s, *last;
int i;
last = head; /*last始终指向尾结点,开始时指向头结点*/
printf("请输入%d个整数:", n);
for (i = 0; i < n; i++) {
s = (LinkList *) malloc(sizeof(LinkList)); /*生成新结点*/
scanf("%d", &s->data); /*读入新结点的数据域*/
s->next = NULL; /*将新结点的指针域为空*/
last->next = s; /*将新结点插入表尾*/
last = s; /*将last指针指向表尾结点*/
}
printf("建立链表操作成功!");
}
int LengthList(LinkList *head) {
/*求链表长度函数*/
LinkList *p = head->next;
int j = 0;
while (p != NULL) { /*当p不指向链表尾时*/
p = p->next;
j++;
}
return j;
}
void Locate(LinkList *head, DataType x) {
/*在链表中查找值为x的元素位置*/
int j = 1; /*计数器*/
LinkList *p;
p = head->next;
while (p != NULL && p->data != x) { /*查找及定位*/
p = p->next;
j++;
}
if (p != NULL)
printf("在表的第%d位找到值为%d的结点!", j, x);
else
printf("未找到值为%d的结点!", x);
}
void SearchList(LinkList *head, int i) {
/*在链表中按位置查找元素*/
LinkList *p;
int j = 0;
p = head; /*p指向链表的头结点*/
if (i > LengthList(head))
printf("位置错误,链表中没有该位置!");
while (p->next != NULL && j < i) {
p = p->next;
j++;
}
if (j == i) /*判断与给定的序号是否相等*/
printf("在第%d位上的元素值为%d!", i, p->data);
}
void InsList(LinkList *head, int i, DataType x) {
/*按位置插入元素函数*/
int j = 0;
LinkList *p, *s;
p = head;
while (p->next != NULL && j < i - 1) { /*定位插入点*/
p = p->next;
j++;
}
if (p != NULL) { /*p不为空则将新结点插到p后*/
s = (LinkList *)malloc(sizeof(LinkList)); /*生成新结点s*/
s->data = x; /*将数据x放入新结点的数据域*/
s->next = p->next; /*将新结点s的指针域与p结点后面元素相连*/
p->next = s; /*将p与新结点s链接*/
printf("插入元素成功!");
} else
printf("插入元素失败");
}
void DelList(LinkList *head, int i) {
/*按位置删除链表中元素函数*/
int j = 0;
DataType x;
LinkList *p = head, *s;
while (p->next != NULL && j < i - 1) { /*定位插入点*/
p = p->next;
j++;
}
if (p->next != NULL && j == i - 1) {
s = p->next; /*q为要删除结点*/
x = s->data; /*将要删除的数据放入指针变量x中*/
p->next = s->next; /*将p结点的指针域与q结点后面元素相连*/
free(s);
printf("删除第%d位上的元素%d成功!", i, x);
} else
printf("删除结点位置错误,删除失败!");
}
void DispList(LinkList *head) {
/*显示输出链表函数*/
LinkList *p;
p = head->next;
while (p != NULL) {
printf("%5d", p->data);
p = p->next;
}
}
void MenuLine() {
// 显示菜单子函数
printf("\n线性表子系统");
printf("\n***********************************************");
printf("\n 1---建立 ");
printf("\n 2---插入 ");
printf("\n 3---删除 ");
printf("\n 4---按位置查找 ");
printf("\n 5---按元素值查找 ");
printf("\n 6---求表长 ");
printf("\n 0---返回 ");
printf("\n***********************************************");
printf("\n请输入菜单号(0-6):");
}
int main() {
LinkList *head;
DataType x;
int i, n;
char ch1, ch2, a;
ch1 = 'y';
while (ch1 == 'Y' || ch1 == 'y') {
MenuLine();
scanf("%c", &ch2);
getchar();
switch (ch2) {
case '1':
head = InitList();
printf("请输入要建立线性表的长度:");
scanf("%d", &n);
CreateListL(head, n);
printf("建立后的线性表为:\n");
DispList(head);
break;
case '2':
printf("请输入要插入的元素位置:");
scanf("%d", &i);
getchar();
printf("请输入要插入的元素值:");
scanf("%d", &x);
InsList(head, i, x);
printf("插元素%d后的线性表为:\n", x);
DispList(head);
break;
case '3':
printf("请输入要删除元素的位置:");
scanf("%d", &i);
DelList(head, i);
printf("删除第%d位的元素后的线性表为:\n", i);
DispList(head);
break;
case '4':
printf("请输入查找的元素位置(大于等于1的整数):");
scanf("%d", &i);
SearchList(head, i);
break;
case '5':
printf("请输入要查找的整数:");
scanf("%d", &x);
Locate(head, x);
break;
case '6':
printf("链表的长度为:%d\n", LengthList(head));
break;
case '0':
ch1 = 'n';
break;
default:
printf("输入有误,请输入0-9进行选择!");
}
if (ch2 != '0') {
printf("\n按回车键继续,按任意键返回主菜单!\n");
a = getchar();
if (a != '\xA') {
getchar();
ch1 = 'n';
}
}
}
}
3.完成算法void dellAll(SeqList *L,int n)删除顺序表中,值为n的所有结点
#include <stdio.h>
#define MAXLEN 100 /*定义常量MAXLEN为100表示存储空间总量*/
typedef int DataType; /*定义ElemType为int类型*/
typedef struct { /*顺序表存储类型*/
DataType data[MAXLEN]; /*存放线性表的数组*/
int Length; /*Length是顺序表的长度*/
} SeqList;
void InitList( SeqList *L ) {
/*初始化顺序表L函数*/
L->Length = 0; /*初始化顺序表为空*/
}
void CreateList(SeqList *L, int n) {
/*建立顺序表并输入多个元素函数*/
int i;
printf("请输入%d个整数:", n);
for ( i = 0; i < n; i++) {
scanf("%d", &L->data[i]);
}
L->Length = i;
/*设线性表的长度为i*/
}
void DispList(SeqList *L) {
/*显示输出顺序表L的每个元素函数*/
int i;
for (int a = 0; a < L->Length; a++) {
printf("%5d", L->data[a]);
}
}
//题目要求完成dellAll函数:
void dellAll(SeqList *L, int n) {
int p, j;
for (int i = 1; i < L->Length + 1; i++) {
if (L->data[i - 1] == n) {
p = i;
j = i;
for (int a = 1; a < L->Length - j + 1; a++, i++)
L->data[i - 1] = L->data[i];
L->Length = L->Length - 1;
i = p;
}
}
}
int main() {
//1.void InitList( SeqList *L )
SeqList list;
InitList( &list );
printf("\n\n");
//2.void CreateList(SeqList *L,int n)
int n;
puts("请输入要输入元素的数量:");
scanf("%d", &n);
CreateList(&list, n);
printf("\n\n");
//3.void DispList(SeqList *L)
DispList(&list);
printf("\n\n");
printf("%d", list.Length);
DataType number;
puts("请输入要删除元素值:");
scanf("%d", &number);
dellAll(&list, number);
DispList(&list);
}
4.完成void ABBA(LinkList *head) int count(LinkList *head , int x)
//完成void ABBA(LinkList *head) int count(LinkList *head , int x)
/*线性表子系统*/
#include <stdio.h>
#include <malloc.h>
typedef int DataType; /*定义DataType为int类型*/
typedef struct linknode { /*单链表存储类型*/
DataType data; /*定义结点的数据域*/
struct linknode *next; /*定义结点的指针域*/
} LinkList;
LinkList *InitList() {
/*初始化链表函数*/
LinkList *head;
head = (LinkList *)malloc(sizeof(LinkList)); /*动态分配一个结点空间*/
head->next = NULL;
return head; /*头结点L指针域为空,表示空链表*/
}
void CreateListL(LinkList *head, int n) {
/*尾插法建立链表函数*/
LinkList *s, *last;
int i;
last = head; /*last始终指向尾结点,开始时指向头结点*/
printf("请输入%d个整数:", n);
for (i = 0; i < n; i++) {
s = (LinkList *) malloc(sizeof(LinkList)); /*生成新结点*/
scanf("%d", &s->data); /*读入新结点的数据域*/
s->next = NULL; /*将新结点的指针域为空*/
last->next = s; /*将新结点插入表尾*/
last = s; /*将last指针指向表尾结点*/
}
printf("建立链表操作成功!");
}
int LengthList(LinkList *head) {
/*求链表长度函数*/
LinkList *p = head->next;
int j = 0;
while (p != NULL) { /*当p不指向链表尾时*/
p = p->next;
j++;
}
return j;
}
void DispList(LinkList *head) {
/*显示输出链表函数*/
LinkList *p;
p = head->next;
while (p != NULL) {
printf("%5d", p->data);
p = p->next;
}
}
//完成函数实现逆置带头单链表
void ABBA(LinkList *head) {
LinkList *p, *q;
p = head->next;
head->next = NULL;
while (p != NULL) {
q = p;
p = p->next;
q->next = head->next;
head->next = q;
}
}
//完成函数计算单链表中值为x的结点的个数
int count(LinkList *head, int x) {
LinkList *p;
int n = 0;
p = head;
while (p != NULL) {
if (p->data == x)
n++;
p = p->next;
}
return n;
}
int main() {
LinkList *head;
//1.LinkList *InitList()
head = InitList();
puts("链表初始化结束");
//2.void CreateListL(LinkList *head,int n)正顺
int n ;
puts("请输入一个整数:");
scanf("%d", &n);
CreateListL(head, n);
printf("\n\n");
//void DispList(LinkList *head)
DispList(head);
printf("\n\n");
//3.int LengthList(LinkList *head)
int length;
length = LengthList(head);
printf("链表的长度为:%d \n\n", length);
//4.void ABBA(LinkList *head)
ABBA(head);
DispList(head);
printf("\n\n");
//5.int count(LinkList *head , int x)
int number, x;
puts("请输入要统计的值:");
scanf("%d", &x);
number = count(head, x);
printf("number = %d \n", number);
}