下面提供两种做法,分别用顺序表和单链表实现。
顺序表:
#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <malloc.h>
using namespace std;
const int LIST_INIT_SIZE = 100;
const int LISTINCREASEMEMT = 10;
//定义元素类型
typedef int ElemType;
//定义顺序表节点结构
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
//构造空的顺序表
bool InitList_Sq(SqList &L){
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L.elem){
return false;
}
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return true;
}
//按大小将元素插入到适当位置(顺序表递增有序)
bool ListInsert_Sq(SqList &L, ElemType e){
ElemType *newbase;
//若当前存储已满,增加分配
if(L.length >= L.listsize){
newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREASEMEMT) * sizeof(ElemType));
if(!newbase){
return false;
}//存储分配失败
L.elem = newbase;
L.listsize += LISTINCREASEMEMT;
}
//寻找合适位置并插入
int i;
for(i=0; i<L.length; i++){
if(L.elem[i] > e){
break;
}
}
ElemType *q = &(L.elem[i]);
ElemType *p=&(L.elem[L.length-1]);
for(q; p>=q; p--){
*(p+1) = *p;
}
*q = e;
++L.length;
return true;
}
//输出顺序表
bool Print(SqList &L){
for(int i=0; i<L.length; i++){
printf("%d ",L.elem[i]);
}
printf("\n");
}
int main(int argc, char** argv) {
int len;
SqList A;
InitList_Sq(A);
cout << "请输入顺序表的长度:";
cin >> len;
cout << endl << "请按递增顺序输入" << len << "个元素:";
for(int i=0; i<len; i++){
scanf("%d",&A.elem[i]);
}
A.length = len;
cout << endl << "请输入需要插入的元素:";
ElemType x;
scanf("%d", &x);
ListInsert_Sq(A, x);
cout << endl << "插入后表中元素依次为:";
Print(A);
return 0;
}
单链表:
#include <iostream>
#include <cstdio>
#include <malloc.h>
#define LIST_INIT_SIZE 100
#define LISTINCREASEMEMT 10
using namespace std;
typedef int ElemType; //定义数据元素类型为整型
//单链表节点结构
typedef struct Node
{
ElemType data; //数据域
struct Node *next; //指针域
}Node,*LinkList;
LinkList p, q, flag;
//创建链表
void CreateList(LinkList &A, int n)
{
A=(LinkList)malloc(sizeof(Node));
p = A;
for(int i=0; i<n; ++i)
{
q = (LinkList)malloc(sizeof(Node));
scanf("%d",&(q->data));
p->next = q;
q->next = NULL;
p = q;
}
}
//按元素大小插入元素到适当位置(顺序表递增有序)
void Insert(LinkList &L, int n, ElemType &x){
p = L->next;
q = (LinkList)malloc(sizeof(Node));
flag = (LinkList)malloc(sizeof(Node));
q->data = x;
for(int i=1; i<=n; i++){
if(p->data < x && i!=n){
flag = p;
p = p->next;
}
else if(i == n){
flag->next = q;
q->next = NULL;
}
else{
q->next = flag->next;
flag->next = q;
break;
}
}
}
//输出表中元素
void PrintfList(LinkList &L, int n){
p = L->next;
printf("%d", p->data);
for(int i=2; i<=n; ++i)
{
p = p->next;
printf(" %d", p->data);
}
printf("\n");
}
int main(int argc, char** argv) {
LinkList A;
ElemType x;
int len;
cout << "请输入顺序表的长度:";
cin >> len;
cout << endl << "请按递增顺序输入" << len << "个元素:";
CreateList(A, len);
cout << endl << "请输入需要插入的元素:";
scanf("%d", &x);
Insert(A, len, x);
cout << endl << "插入后表中元素依次为:";
PrintfList(A, len+1);
return 0;
}