线性表
顺序表
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int length;
}SqList;
bool ListInsert(SqList& L, int i, ElemType e) {
if (i<1 || i>L.length + 1) return false;
if (L.length >= MaxSize) return false;
for (int j = L.length; j >= i; j--) {
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
return true;
}
bool ListDelete(SqList& L, int i, ElemType& e) {
if (i<1 || i>L.length) return false;
e = L.data[i - 1];
for (int j = i; j < L.length; j++) {
L.data[j - 1] = L.data[j];
}
L.length--;
return true;
}
int LocateElem(SqList L, ElemType e) {
for (int i = 0; i < L.length; i++) {
if (L.data[i] == e) return i + 1;
}
return 0;
}
void PrintList(SqList& L) {
for (int i = 0; i < L.length; i++){
printf("%4d", L.data[i]);
}
printf("\n");
}
int main() {
SqList L;
bool ret;
ElemType del;
L.data[0] = 1;
L.data[1] = 2;
L.data[2] = 3;
L.length = 3;
ret = ListInsert(L, 2, 60);
if (ret) {
printf("插入成功\n");
PrintList(L);
}else{
printf("插入失败\n");
}
ret = ListDelete(L, 1, del);
if (ret){
printf("删除成功\n");
printf("删除元素值为 %d\n",del);
PrintList(L);
}else{
printf("删除失败\n");
}
int elel_pos = LocateElem(L, 60);
if (elel_pos){
printf("查找成功\n");
printf("元素位置为 %d\n", elel_pos);
}else{
printf("查找失败\n");
}
return 0;
}
单链表
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
LinkList CreatList1(LinkList &L) {
LNode* s; int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
scanf("%d", &x);
while (x!=9999){
s = (LNode*)malloc(sizeof(LNode));
s -> data = x;
s->next = L->next;
L->next = s;
scanf("%d", &x);
}
return L;
}
LinkList CreatList2(LinkList& L) {
int x;
L = (LinkList)malloc(sizeof(LNode));
LNode* s, * r = L;
scanf("%d", &x);
while (x != 9999) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d", &x);
}
r->next = NULL;
return L;
}
LNode* GetElem(LinkList L,int i) {
int j = 1;
LNode* p = L->next;
if (i == 0) {
return L;
}
if (i < 1) {
return NULL;
}
while (p&&j<i){
p = p->next;
j++;
}
return p;
}
LNode* LocateElem(LinkList L, ElemType e) {
LinkList p = L->next;
while (p!=NULL && p->data !=e){
p = p->next;
}
return p;
}
bool ListFrontInsert(LinkList L, int i, ElemType e) {
LinkList p = GetElem(L, i - 1);
if (NULL == p) {
return false;
}
LinkList s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
bool ListDelete(LinkList L,int i) {
LinkList p = GetElem(L, i - 1);
if (NULL == p) {
return false;
}
LinkList q;
q = p->next;
if (q == NULL) {
return false;
}
p->next = q->next;
free(q);
q = NULL;
return true;
}
void PrintList(LinkList L) {
L = L->next;
while (L!=NULL){
printf("%3d", L->data);
L = L->next;
}
printf("\n");
}
int main() {
LinkList L;
LinkList search;
CreatList2(L);
PrintList(L);
search = GetElem(L, 2);
if (search != NULL) {
printf("按序号查找成功\n");
printf("%d\n", search->data);
}
search = LocateElem(L, 6);
if (search != NULL)
{
printf("按值查找成功\n");
printf("%d\n", search->data);
}
ListFrontInsert(L, 2, 99);
PrintList(L);
ListDelete(L, 4);
PrintList(L);
}
双向链表
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct DNode {
ElemType data;
struct DNode* prior, * next;
}DNode, * DLinkList;
DLinkList Dlist_head_insert(DLinkList& DL) {
DNode* s; int x;
DL = (DLinkList)malloc(sizeof(DNode));
DL->next = NULL;
DL->prior = NULL;
scanf("%d", &x);
while (x != 9999) {
s = (DNode*)malloc(sizeof(DNode));
s->data = x;
s->next = DL->next;
if (DL->next != NULL) {
DL->next->prior = s;
}
s->prior = DL;
DL->next = s;
scanf("%d", &x);
}
return DL;
}
DLinkList Dlist_tali_insert(DLinkList& DL) {
int x;
DL = (DLinkList)malloc(sizeof(DNode));
DNode* s, * r = DL;
DL->prior = NULL;
scanf("%d", &x);
while (x != 9999) {
s = (DNode*)malloc(sizeof(DNode));
s->data = x;
r->next = s;
s->prior = r;
r = s;
scanf("%d", &x);
}
r->next = NULL;
return DL;
}
DNode* GetElem(DLinkList DL, int i) {
int j = 1;
DNode* p = DL->next;
if (i == 0) {
return DL;
}
if (i < 1) {
return NULL;
}
while (p && j < i) {
p = p->next;
j++;
}
return p;
}
bool DListFrontInsert(DLinkList DL, int i, ElemType e) {
DLinkList p = GetElem(DL, i - 1);
if (NULL == p) {
return false;
}
DLinkList s = (DLinkList)malloc(sizeof(DNode));
s->data = e;
s->next = p->next;
p->next->prior = s;
s->prior = p;
p->next = s;
return true;
}
bool DListDelete(DLinkList DL, int i) {
DLinkList p = GetElem(DL, i - 1);
if (NULL == p) {
return false;
}
DLinkList q = p->next;
if (q == NULL) {
return false;
}
p->next = q->next;
if (q->next != NULL) {
q->next->prior = p;
}
free(q);
return true;
}
void PrintDList(DLinkList DL) {
DL = DL->next;
while (DL != NULL) {
printf("%3d", DL->data);
DL = DL->next;
}
printf("\n");
}
int main() {
DLinkList DL;
DLinkList search;
Dlist_head_insert(DL);
PrintDList(DL);
search = GetElem(DL, 2);
if (search != NULL) {
printf("按序号查找成功\n");
printf("%d\n", search->data);
}
DListFrontInsert(DL, 3, 99);
PrintDList(DL);
DListDelete(DL, 2);
PrintDList(DL);
}