順序表的基本操作:
#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;
}