【自考】数据结构导论—第2章线性表代码

目录

 写出计算方阵A[n][n]与B[n][n]乘积C[n][n]的算法

设有一n阶方阵A,设计算法实现对该矩阵的转置。P30 

 顺序表插入(O(n))P38

顺序表删除(O(n))

顺序表定位(O(n))

单链表初始化

单链表求表长

单链表读表元素

单链表定位元素

单链表插入

单链表删除 P47

双向循环链表删除

双向循环链表插入

在带头结点的双向循环链表上实现线性表的下列基本运算


写出计算方阵A[n][n]与B[n][n]乘积C[n][n]的算法

分析算法的时间复杂度O(n^3)

void matrixmultiply(int A[][n],int B[][n],int C[][n],int n){
     int i,j;
     for(i=0;j<n;j++){
        for(j=0;j<n;j++){
           C[i][j]=0;
           for(k=0;k<n;k++){
               C[i][j]+=A[i][K]*B[K][j]
            }
       }
    }
}

设有一n阶方阵A,设计算法实现对该矩阵的转置。P30 

// 【1710真题】
void MM (int A[n][n])   
{
      int i,j,temp;
     for(i=0;i<n;j++)
 { 
    for(j=0;j<n;j++)            
    {    
        temp=A[i][j]; 
         A[i][j]=A[j][i];
         A[j][i]=temp;
     }
 }
}

 顺序表插入(O(n))P38

//【1810真题】
void insertSeqlist(SeqList  L,DataType x,int i)
{
     if(L.length==Maxsize) exit("表已满");
     if(i<1||i>L.length+1) exit("位置错");
     for(j=L.length;j>=i;j--){
         L.data[j]=L.data[j-1];
        }
     L.data[i-1]=x;
     L.length++; 
}

顺序表删除(O(n))

void DeleteSeqlist(SeqList  L,int i)
{
     if(i<1||i>L.length+1) exit("非法位置");
     for(j=i;j<L.length;j++){
         L.data[j-1]=L.data[j];
        }
     L.length--;
}

顺序表定位(O(n))

void LocateSeqlist(SeqList  L,DataType x)//x为要找的元素
{
    int i=0;
     while((i<L.length+1)&&(L.data[i]!==x) 
          i++;
    if(i<L.length) return i+1;
    else return 0;
}

单链表初始化

//【1804真题】
typedef struct
{
     int num; char name[8];char sex[2];int age;int score;
}DateType;
typedef struct node
{
      DateType  data;
      struct  node * next;
}Node, *LinkList;
LinkList  head;

LinkList  InitiateLinkList(){
    LinkList head; 
    head=malloc(sizeof(Node));//动态构建一头结点
    head->next=NULL;
    return head;
}

单链表求表长

//【1410真题】
int LengthLinklist(linkList head){
     Node *p=head;      //p是工作指针,初始时p指向头结点
     int cnt=0;         //判断器置初值
     while(p->next!=NULL)//判断是否为尾结点
    {
        p=p->next;//指针移动到下一个结点
        cnt++;
    }
    return cnt;
}

单链表读表元素

Node * GetLinklist(LinkList head,int i)//在head中查找第i个元素结点,若找到,则返回指向该结点的指针;否则返回NULL
{
     Node *p;     
     p=head->next;
     int c=1;
     while((c<i)&&(p!=NULL))    //当未到第i结点且未到尾结点时继续后移
        {
            p=p->next;
            c++;
        }        
     if(i==c) return p;         //找到第i个结点
     else return NULL;          //i<1或i>n,i值不合法,查找失败
}

单链表定位元素

int  LocateLinklist(LinkList head,DataType x)
{
     Node *p=head;
     p=p->next;
     int i=0;
     while(p!=NULL&&p->data!=x)
        {
            i++;
            p=p->next;
        } 
     if(p!=NULL) return i+1;
     else return 0;
}

单链表插入

void insertLinklist(LinkList head,DataType x,int i)
{
     Node *p,*q;
     if(i==1) q=head;
     else q=GetLinklist(head,i-1);
     if(q==NULL) exit("找不到插入的位置");
     else
        {
          p=malloc(sizeof(Node));
          p->data=x;//生成新结点
          p->next=q->next; //新结点链域指向q的后继结点
          q->next=p;       //修改q的链域
         }
}

单链表删除 P47

//【1210真题】
void DeleteLinklist(LinkList head,int i)
{
     Node *q;
     if(i==1) q=head;
     //else q=GetLinklist(head,i-1);  //先找待删结点的直接驱动
      else{
          p=head->next;
             int c=1;
             while((c<i)&&(p!=NULL))    //当未到第i结点且未到尾结点时继续后移
                {p=p->next;c++;}        
      }
     if(q!==NULL) 
        {
         p=q->next;    //p指向待删结点
         q->next=p->next;    //移出待删结点
         free(p);       //释放已移出结点p的空间
         }
      else exit("找不到删除的结点");
}

双向循环链表删除

p->prior->next=p->next;      //p前驱结点的后链指向p的后继结点
p->next->prior=p->prior;     //p后继结点的前链指向p的前驱结点
free(p);                     //释放*p的空间

双向循环链表插入

t->prior=p;
t->next=p->next;      
p->next->prior=t;    
p->next=t;   

在带头结点的双向循环链表上实现线性表的下列基本运算

1、初始化;2、定位;3、插入;4、删除

//初始化
  void Init_dlklist(DLinkList head){
      DLlinkList p;
      p=malloc(sizeof(Node));
      p->next=p;
      p->prior=p;
      head=p;
  }

//定位
int Locate_dlklist(DLinkList head,DataType x){
    Node *p=head->next;
    int i=0;
    int Found=0;
    while((p!=head)&&(!Found))
   {
        i++;
        if(p->data!=x)  p=p->next;
        else Found=1;
   }
   if(Found)  return i;
   else return 0;   
}

//插入
void  Insertdlklist(DLinkList head,DataType x,int i){
    int c=0;
    p=head;
    while(p->next!=head)&&(c<i-1)
  {
     p=p->next;c++
 }
    if(i==c-1)
   {
      t=malloc(sizeof(Node));
      t->data=x;
      t->prior=p;
      t->next=p->next;
      p->next->prior=t;
      p->next=t;
   }
    else error("未找到第i-1个节点");
}

//删除
  void  Deletedlklist(DLinkList head,int i){
      int c=0;
     p=head;
    while(p->next!=head)&&(c>i){
      p=p->next;c++;
   }
     if(i==c){
       p->prior->next=p->next;
       p->next->prior=p->prior;
       free(p);
    }
    else error("未找到第i个结点");
 }

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值