线性表
顺序存储
链式存储
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>typedef int ElemType;typedef int Position;typedef struct LNode {ElemType data;struct LNode* next;} LNode, * LinkList;void PrintList(LinkList L);LinkList CreatListHead(LinkList L); // 头插法LinkList CreatListTail(LinkList L); // 尾插法LinkList GetElem(LinkList L, Position i); // 按位置查找LinkList LocateElem(LinkList L, ElemType e);bool ListFrontInsert(LinkList L, Position i, ElemType e);bool ListDelete(LinkList L, Position i);int main(){LinkList L = NULL;L = CreatListTail(L);PrintList(L);//LNode* search;//search = GetElem(L, 100);//if (search != NULL)//{// printf("按序号查找成功!\n");// printf("%d\n", search->data);//}//search = LocateElem(L, 88);//if (search != NULL)//{// printf("按值查找成功!\n");// printf("%d\n", search->data);//}ListDelete(L, 2);PrintList(L);return 0;}// ========================函数区=========================void PrintList(LinkList L){L = L->next; // 因为统一要求带头结点,所以此处可以放心大胆的使用L->next。while (L){printf("%d ", L->data);L = L->next;}printf("\n");}// 头插法LinkList CreatListHead(LinkList L){L = (LinkList)malloc(sizeof(LNode)); //L->next = NULL; // 如果是空表,确保没有安全隐患LNode* p;ElemType input;scanf("%d", &input);while (input != 9999) {p = (LNode*)malloc(sizeof(LNode));p->data = input;p->next = L->next;L->next = p;scanf("%d", &input);}return L;}// 尾插法LinkList CreatListTail(LinkList L){L = (LinkList)malloc(sizeof(LNode));LinkList s, r = L; // r表示链表表尾结点ElemType input;scanf("%d", &input);while (input!=9999){s = (LinkList)malloc(sizeof(LNode));s->data = input;r->next = s;r = s;scanf("%d", &input);}r->next = NULL; // 尾结点的next指针赋值为NULLreturn L;}LinkList GetElem(LinkList L, Position i){if (i == 0)return L;else if (i < 1)return NULL;LinkList p = L->next;int j = 1;while (p && j < i){p = p->next;++j;}return p;}LinkList LocateElem(LinkList L, ElemType e){LinkList p = L->next;while (p && p->data != e)p = p->next;return p;}bool ListFrontInsert(LinkList L, Position i, ElemType e){LinkList p = GetElem(L, i - 1); // 拿到第i-1个元素的指针if (!p)return false;LinkList s = (LinkList)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;return true;}bool ListDelete(LinkList L, Position i){LinkList p = GetElem(L, i - 1);if (!p)return false;LinkList q = p->next;p->next = q->next;free(q);q = NULL; // 为了避免野指针return true;}
栈
顺序栈
#include <stdio.h>#define MaxSize 50typedef int ElemType;typedef struct {ElemType data[MaxSize];int top;} SqStack;void InitStack(SqStack& S);bool IsEmpty(SqStack S);bool IsFull(SqStack S);bool Push(SqStack& S, ElemType x);bool Pop(SqStack& S, ElemType& x);bool GetTop(SqStack S, ElemType& x);int main(){SqStack S;bool flag;InitStack(S);flag = IsEmpty(S);ElemType ele;if (flag) {printf("栈是空的.\n");}Push(S, 3);Push(S, 4);Push(S, 5);flag = GetTop(S, ele);if (flag)printf("栈顶元素:%d\n", ele);flag = Pop(S, ele);if (flag)printf("弹出元素:%d\n", ele);return 0;}// =========================函数区=======================void InitStack(SqStack &S){S.top = -1;}bool IsEmpty(SqStack S){return -1 == S.top;}bool IsFull(SqStack S){return MaxSize - 1 == S.top;}bool Push(SqStack& S, ElemType x){if (IsFull(S))return false;else {S.data[++S.top] = x;return true;}}bool Pop(SqStack& S, ElemType& x){if (IsEmpty(S))return false;else {x = S.data[S.top--];return true;}}bool GetTop(SqStack S, ElemType& x){if (IsEmpty(S))return false;else {x = S.data[S.top];return true;}}
链栈(不重要)
一句话:头部插入,头部删除。
typedef struct LinkNode {ElemType data;struct LinkNode* next;}* LinkStack;
