目录
写出计算方阵A[n][n]与B[n][n]乘积C[n][n]的算法
写出计算方阵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个结点");
}