线性表-(顺序表与链表的实现)

顺序表的基本操作:

#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;
        }
发布了35 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Honeycomb_1/article/details/79234355
今日推荐