1.线性表的顺序表示和实现(顺序表):
#include<stdio.h> #define MaxSize 100 typedef int DataType; typedef struct //定义结构体Seqlist { DataType list[MaxSize]; int size; } SeqList; //初始化顺序表L void ListInitiate(SeqList *L) { L->size=0; //定义初始数据元素个数 } int ListLength(SeqList L) //当前数据元素个数 { return L.size; } int ListInsert(SeqList *L,int i,DataType x) { int j; if(L->size>=MaxSize) { printf("顺序表已满无法插入! "); return 0; } else if(i<0||i>L->size) { printf("i is error"); return 0; } else { for(j=L->size; j>i-1; j--) L->list[j]=L->list[j-1]; L->list[i-1]=x; L->size++; return 0; } } //删除数据元素 int ListDelete(SeqList *L,int i) { int j; if(L->size<=0) { printf("顺序表已无数据元素可删! "); return 0; } else if(i<0||i>L->size-1) { printf("i is error "); return 0; } else { for(j=i; j<=L->size-1; j++) L->list[j-1]=L->list[j]; L->size--; return 0; } } //查找数据元素 int ListSearch(SeqList L,DataType x) { int i; for (i=0; i<L.size; i++) { if(L.list[i]==x) { printf("找到,%d在第%d个位置 ",x,i+1); return 0; } } printf("没有找到%d ",x); return 0; } int main() { SeqList La,Lb,Lc; int i,x; int n,m;//线性表长度 ListInitiate(&La); printf("请输入线性表La的长度: "); scanf ("%d",&n); La.size=n; printf("请输入线性表La中的元素: "); for(i=0; i<n; i++) scanf ("%d",&La.list[i]); printf("请输入要插入到线性表La中的数字x和插入的位置i: "); scanf("%d%d",&x,&i); ListInsert(&La,i,x); printf("线性表La="); for(i=0; i<La.size; i++) printf("%d ",La.list[i]); printf(" 请输入要删除的数字的位置: "); scanf("%d",&i); ListDelete(&La,i) ; printf("线性表La= "); for(i=0; i<La.size; i++) printf("%d ",La.list[i]); printf(" 请输入要查找的数字: "); scanf("%d",&x); ListSearch(La,x); return 0; }
2.线性表的链式表示和实现(单链表):
# include <iostream> # include <cstdio> # include <algorithm> # include <queue> # include <cmath> # include <cctype> # include <cstring> //sizeof(x)--计算变量x的长度 # include <cstdlib> //mallioc(m)--开辟m字节长度的地址空间,并返回这段空间的首地址 # define ERROR 0 //free(p)--释放指针p所指变量的存储空间,即彻底删除一个变量 # define OK 1 typedef int Status; using namespace std; typedef struct Lnode { int data;//数据域:元素本身信息 struct Lnode *next;//指针域:指示直接后继的存储位置 } Lnode, *LinkList; //*LinkList为指向Lnode类型的指针类型 int m = sizeof(Lnode);//Lnode变量长度 /*LinkList CreateList(int n)//每次将新插入的结点作为首元结点 { LinkList s, L; L = (LinkList)malloc(m);//为结点分配内存空间(开辟头指针) L->next = NULL; while(n--) { s = (LinkList)malloc(m);//为每个元素开辟存储空间 cin >> s->data;//将数据存到结点中(将数据存到s的数据域中) s->next = L->next;//将链表的首元结点作为新结点的后继 L->next = s;//将当前结点作为头结点的后继 } return L; }*/ LinkList CreateListRear(int n)//每次将新插入的结点作为表尾结点 { LinkList L, s, rear; L = rear = (LinkList)malloc(m); L->next = NULL; while(n--) { s = (LinkList)malloc(m);//为每个元素开辟存储空间 cin >> s->data;//将数据存到结点中(将数据存到s的数据域中) rear->next = s;//将新节点s作为rear的后继; rear = s;//让rear指向新的表尾结点s; } rear->next = NULL; return L; } void TraverseList(LinkList L)//遍历单链表 { LinkList p = L->next;//声明一个指针p指向首元结点 while(p) { cout << p->data << " ";//输出当前元素p->data p = p->next;//指针p指向下一个元素 } cout << endl; } /*Status ListInsert(LinkList L, int i, int e)//单链表的插入 { int j = 1; LinkList p, s, s1; p = L; s = L->next; while(s && j < i) { p = s; s = s->next; j++; } if((s == NULL && j < i) || i < 1) return ERROR; s1 = (LinkList)malloc(m); s1->data = e; s1->next = p->next; p->next = s1; return OK; }*/ /*Status ListDel(LinkList L, int i)//单链表的删除 { LinkList p = L, s = L->next; int j = 1; while(s && j < i) { p = s; s = s->next; j++; } if((s == NULL && j < i) || i < 1) return ERROR; p->next = s->next; free(s); return OK; }*/ int main() { int n; LinkList L; cin >> n; //L = CreateList(n); L = CreateListRear(n); //int k; //cin >> k;//k表示要删除的位置 //ListDel(L, k); //int x, y;//x表示要插入的位置,y表示要插入的数 //cin >> x >> y; //ListInsert(L, x, y); TraverseList(L); return 0; }