顺序表的基本操作:
#include <cstdio>
#include <malloc.h>
#define MAXSIZE 256///数组大小
typedef int datatype;///重新命名int
typedef struct {
datatype data[MAXSIZE];
int last;
}Seqlist;
void menu(){
///说明一下此线性表要实行那种功能的操作
printf("\n");
printf("\t\t1.initialization\n");
printf("\t\t2.insert\n");
printf("\t\t3.delete\n");
printf("\t\t4.location\n");
printf("\t\t5.exit\n");
printf("\nplease select:");
}
Seqlist *init(){///初始化顺序表
Seqlist *L;///定义表类型
L=(Seqlist*)malloc(sizeof(Seqlist));///分配内存
L->last=-1;///置表为空
return L;
}
int Insert(Seqlist *L,int i,datatype x){///插入一个数
int j;
if(L->last==MAXSIZE-1) {///判断此时表是否还有位置
printf("table is full!");
return -1;
}
if(i<1||i>(L->last+2)){///判断此时i是否超出表的空间
printf("place is wrong!");
return 0;
}
for(j=L->last;j>=i-1;j--)
L->data[j+1]=L->data[j];///移动元素
L->data[i-1]=x;///插入x,注意:由于i是表示第几个元素,所以i在表的位置是i-1
L->last++;///表的长度加1
return 1;
}
int Delete(Seqlist *L,int i){///删除一个数
int j;
if(i<1||i>(L->last+2)){
printf("this element don't exit!");
return 0;
}
for(j=i;j<=L->last;j++)
L->data[j-1]=L->data[j];///全部元素向左移动一个位置
L->last--;///表的长度减1
return 1;
}
int Location(Seqlist *L,datatype x){///查找元素
int i=0;
while(i<=L->last&&L->data[i]!=x) i++;
if(i>L->last) return -1;
else return i;
}
int main(){
int n,m=1;
Seqlist *L;
while(m){
menu();
scanf("%d",&n);///输入你想进行的操作编号
switch(n){
case 1:L=init();
break;
case 2:{
int i,x,success;
scanf("%d%d",&i,&x);///输入插入位置和插入数
success=Insert(L,i,x);
if(success)///success不为0,即插入成功
for(int i=0;i<=L->last;i++)
printf("%5d",L->data[i]);
break;
}
case 3:{
int i,success;
scanf("%d",&i);///输入要删除的第i个位置
success=Delete(L,i);
if(success)
for(int i=0;i<=L->last;i++)
printf("%5d",L->data[i]);
break;
}
case 4:{
int x,success;
scanf("%d",&x);///输入要查找的数
success=Location(L,x);
if(success) printf("%d%5d\n",success+1,L->data[success]);///输出第几个元素,和表中的所查找的数
else printf("Sorry,there isn't this value!\n");
break;
}
case 5:
m=0;
}
}
}
单链表的基本操作:
注意:初始化链表与建立链表都有初始化的作用,但是初始化时计算长度要-1,因为头指针算进去了。而建立链表没有算头指针,因为它已经建立一个链表,长度不用-1.
#include <cstdio>
#include <stdlib.h>
///typedef int datatype;
typedef struct Node{
int data;
struct Node *next;
}Node,*linklist;
void menu(){
printf("\t1-初始化链表\n");
printf("\t2-链表长度\n");
printf("\t3-查找\n");
printf("\t4-插入\n");
printf("\t5-删除\n");
printf("\t6-链表元素逆置\n");
printf("\t7-遍历输出链表元素\n");
printf("\t8-操作结束\n");
}
linklist init(){///初始化链表
Node *L;
L=(Node *)malloc(sizeof(Node));
if(L==NULL){
puts("申请内存空间失败");
}
L->next=NULL;
return L;
}
linklist Greak_linklist(){///建立链表
linklist L=NULL;
Node *s,*r=NULL;
int x;
scanf("%d",&x);
while(x!=-1){
s=(Node *)malloc(sizeof(Node));
s->data=x;
if(L==NULL) L=s;
else r->next=s;
r=s;
scanf("%d",&x);
}
if(r!=NULL) r->next=NULL;
return L;
}
int length_linklist(linklist L){///求链表长度
Node *p=L;
int j=0;
while(p){
j++;
p=p->next;
}
return j;
}
Node *find_linklist(linklist L,int i){///按位查找
Node *p=L;
int j=0;
while(p->next!=NULL&&j<i){
p=p->next;
j++;
}
if(j==i) return p;
else return NULL;
}
void insert_linklist(linklist L,int i,int x){///插入元素
Node *p,*s;
p=find_linklist(L,i-1);
if(p==NULL){
puts("参数i错误");
}
else{
s=(Node *)malloc(sizeof(Node));
s->data=x;
s->next=p->next;
p->next=s;
}
}
void Delete_linklist(linklist L,int i){///删除元素
linklist p,s;
p=find_linklist(L,i-1);
if(p==NULL) {
puts("第i-1结点不存在");
}
else {
if(p->next==NULL){
puts("第i结点不存在");
}
else {
s=p->next;
p->next=s->next;
free(s);
}
}
}
void Reverse_linklist(linklist L){///链表元素逆置
Node *p,*q;
p=L->next;
L->next=NULL;
while(p){
q=p;
p=p->next;
q->next=L->next;
L->next=q;
}
}
void printf_linklist(linklist L){///遍历输出
Node *p;
p=L;
p=p->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
puts("");
}
int main(){
int n,m=1;
Node *L;
while(m){
menu();
scanf("%d",&n);
switch(n){
case 1:
/// L=Greak_linklist();
L=init();
break;
case 2:
{
int len=length_linklist(L)-1;
printf("%d\n",len);
break;
}
case 3:{
int i;
Node *p;
scanf("%d",&i);
p=find_linklist(L,i);
if(L!=NULL) printf("%d\n",p->data);
else puts("Fail!");
break;
}
case 4:{
int i,x;
scanf("%d%d",&i,&x);
insert_linklist(L,i,x);
break;
}
case 5:{
int i;
scanf("%d",&i);
Delete_linklist(L,i);
break;
}
case 6:
Reverse_linklist(L);
break;
case 7:
printf_linklist(L);
break;
case 8:
m=0;
}
}
}
下面是顺序表实现的线性表:
Description
以下是 线性表 的几个命令以及其含义:
INIT 初始化线性表
PRINT 输出一行:从头到尾输出线性表每一个元素,每个元素尾随一个空格
ADD x value 把value插入到线性表的第x个位置,如果x超过线性表的元素个数,则把value作为线性表最后一个元素。
DELETE x 删除线性表的第x个元素,如果x超过线性表的元素个数,则不做任何处理。
LENGTH 输出当前线性表的元素个数
线性表的首元素位置定义为1,它后面的元素的位置定义为2,以此类推。
线性表的元素都是整数,且绝对值小于10000。
Input
测试用例的第一行是一个整数 n ( 0 < n < 10000 ) ,表示有多少条命令。
接下来是n行,每行是一条命令。按顺序从头到尾执行每一条命令。
Output
对其中的PRINT和LENGTH命令,输出相应信息。
Sample Input
11
INIT
ADD 1 5
ADD 1 4
ADD 1 3
LENGTH
ADD 1 2
ADD 1 1
PRINT
DELETE 5
LENGTH
PRINT
Sample Output
3
1 2 3 4 5
4
1 2 3 4
#define listsize 10010
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct seqlist{
int data[listsize];
int length;
};
void insertlist(struct seqlist *L,int n,int x){//插入元素
int i;
if(n>L->length)
L->data[L->length]=x;
else
{
for(i=L->length;i>=n-1;i--)
L->data[i]=L->data[i-1];
L->data[n-1]=x;
}
L->length++;}
void deletelist(struct seqlist *L,int n){//删去元素
int i;
if(n>L->length||n<1) return;
else{
for(i=n-1;i<L->length;i++)
L->data[i]=L->data[i+1];}
L->length--;
}
int PRIN(struct seqlist *L){//输出各个元素
int i;
for(i=0;i<L->length;i++)
printf("%d ",L->data[i]);
printf("\n");
return 0;
}
void len(struct seqlist *L){//输出当前元素个数
printf("%d\n",L->length);
}
void initlist(struct seqlist *L){//初始化链表
L->length=0;}
int main(){
struct seqlist l;
int k,t;
char command[10];
int a,b;
scanf("%d",&t);
while(t--){
scanf("%s",command);
if(strcmp("INIT",command)==0)
initlist(&l);
else if(strcmp("ADD",command)==0){
scanf("%d%d",&a,&b);
insertlist(&l,a,b);
}
else if(strcmp("PRINT",command)==0){
PRIN(&l);
}
else if(strcmp("LENGTH",command)==0){
len(&l);
}
else if(strcmp("DELETE",command)==0){
scanf("%d",&k);
deletelist(&l,k);}
}
return 0;
}