2-1-1 线性表Seqlist的创建,代码如下:
#define maxn 100 //线性表的最大长度
typedef struct
{
int elem[maxn];
int last;
} Seqlist;
2-1-2顺序表的插入运算,代码如下:
#include<stdio.h>
#define maxn 100
typedef struct
{
int elem[maxn];
int last;
} Seqlist;
int Insert(Seqlist *L,int i,int e)
{
if(i < 1 || i > L->last+2)//判断插入位置是否合法
{
printf("error!\n");
return 0;
}
if(L->last >= maxn-1)
{
printf("已满\n");
return 0;
}
for(int k = L->last; k >= i-1; k--)//为插入移动位置
L->elem[k+1] = L->elem[k];
L->elem[i-1] = e;
L->last++;
return 1;
}
int main()
{
Seqlist a;
int n,m,x;
while(~scanf("%d",&n))
{
for(int i =0; i<n;i++)
scanf("%d",&a.elem[i]);
a.last=n-1;
printf("插入元素的位置和值:");
scanf("%d %d",&m,&x);
printf("插入前:\n");
for(int i = 0;i<n;i++)
printf("%d ",a.elem[i]);
printf("\n");
if(Insert(&a,m,x))
{
printf("插入后:\n");
for(int i=0; i<n+1; i++)
printf("%d ",a.elem[i]);
}
printf("\n16031110208尚艳丽\n");
}
return 0;
}
2-1-3顺序表的删除运算,代码如下:
#include<stdio.h>
#define maxn 100
typedef struct
{
int elem[maxn];
int last;
} Seqlist;
int Delete(Seqlist *L,int i,int *e)//顺序表的删除
{
if(i < 1 || i > L->last+1)//判断删除位置
{
printf("error!\n");
return 0;
}
*e=L->elem[i-1];//将删除元素存放在e所指向的变量中
for(int k = i; k<=L->last; k++)
L->elem[k-1] = L->elem[k];//后面元素依次后移
L->last--;
return 1;
}
int main()
{
Seqlist a;
int n,m,x;
while(~scanf("%d",&n))
{
for(int i =0; i<n; i++)
scanf("%d",&a.elem[i]);
a.last=n-1;
printf("删除元素位置:");
scanf("%d",&m);
printf("\n删除前:\n");
for(int i = 0; i<n; i++)
printf("%d ",a.elem[i]);
printf("\n");
if(Delete(&a,m,&x))
{
printf("删除后:\n");
for(int i=0; i<=a.last; i++)
printf("%d ",a.elem[i]);
}
printf("\n16031110208尚艳丽\n");
}
return 0;
}
2-2-1初始化单链表数据,代码如下:
typedef struct Note//节点类型定义
{
char a;
struct Note* next;
} Note,*list;
InitList(list *L)
{
*L(list)malloc(sizeof(Node));//建立头结点
(*L)->next=NULL;//建立空的单链表
}
2-2-2创建链表并输出,代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Note
{
char a;
struct Note* next;
} Note,*list;
void CF(list L)//头插法建表
{
Note *s;
char c;
int flag = 1;
while(flag)
{
c = getchar();
getchar();
if(c != '$')
{
s=(Note*)malloc(sizeof(Note));//建立新的节点
s->a=c;
s->next=L->next;//将s节点插入表头
L->next=s;
}
else flag = 0;
}
}
int main()
{
list L,s;
L=(list)malloc(sizeof(Note));
L->next=NULL;
CF(L);
s=L->next;
printf("头插法建表输出单链表:\n\n");
while(s->next!=NULL)
{
printf("%c ",s->a);
s=s->next;
}
printf("%c\n",s->a);
printf("\n16031110208尚艳丽\n");
return 0;
}
2-2-3单链表获得第i个元素,代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Note
{
char a;
struct Note* next;
} Noet,*list;
Note* get(list L,int i) //查找第i个元素
{
int j;
Note *p;
p=(Note*)malloc(sizeof(Note));
if(i<=0)return NULL;
p=L->next,j=0;
while(p->next!=NULL&&j<i)
{ p=p->next; j++; //计数器 }
if(i==j) //找到第i节点
return p;
else return NULL; //找不到返回空
}
int main()
{
list L,s,t;
char c;
int flag=1;
L=(Note*)malloc(sizeof(Note));
L->next=NULL; t=L;
while(flag)//尾插法建表
{
c=getchar(); getchar();
if(c!='$')
{ s=(Note*)malloc(sizeof(Note));
s->a=c; t->next=s; t=s;
}
else
{ flag=0; t->next=NULL; }
}
int n;
printf("查找元素位置:");
scanf("%d",&n);
Note*r;
r=(Note*)malloc(sizeof(Note));
if(get(L,n)!=NULL)
{
r=get(L,n-1);
printf("\n输出查找元素:\n\n");
printf("%c\n",r->a);
}
printf("\n16031110208尚艳丽\n");
return 0;
}
2-2-4单链表中插入元素,代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct Note
{
int a;
Note* next;
} Note,*list1;
bool insert(list1 L,int i,int e)//单链表的插入
{
Note*p,*s;
int k=0;
if(i<=0) return false;
p=L;
while(p!=NULL&&k<i-1)
{p=p->next; k++;}
if(p==NULL)//如果当前位置为空表示已找完,但没有到第i个元素说明插入位置不合理
{ printf("插入错误\n"); return false;}
s=(Note*)malloc(sizeof(Note)); //申请新的节点
s->a=e;
s->next=p->next; //修改指针 完成插入
p->next=s;
return true;
}
int main()
{
list1 L,r,s;
L=(Note*)malloc(sizeof(Note));
L->next=NULL;
printf("插入前:\n\n");
int flag=1,c;
r=L;
while(flag) //尾插法建表
{
scanf("%d",&c);
if(c!=0)
{
s=(Note*)malloc(sizeof(Note));
s->a=c; r->next=s; r=s;
}
else
{ flag=0; r->next=NULL; }
}
int n,m;
printf("插入元素位置和值:");
scanf("%d %d",&n,&m);
if(insert(L,n,m))
{
printf("\n插入后:\n");
while(L->next!=NULL)
{ L=L->next; printf("%d ",L->a);}
}
else printf("插入错误\n");
printf("\n16031110208尚艳丽\n");
return 0;
}
2-2-5单链表中删除元素,代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct Note
{
int a;
Note* next;
} Note,*list1;
bool dele(list1 L,int i,int *e) //单链表的删除
{
Note*p,*s;
int k=0;
if(i<=0)
return false;
p=L;
while(p!=NULL&&k<i-1)
{ p=p->next; k++; }
if(p->next==NULL)
{ printf("删除位置错误\n"); return false; }
s=p->next;
p->next=s->next;//修改指针 删除节点r
*e=s->a;
free(s); //释放被删除的节点所占空间
return true;
}
int main()
{
list1 L,r,s;
L=(Note*)malloc(sizeof(Note));
L->next=NULL;
int flag=1,c;
r=L;
printf("删除前:\n\n");
while(flag) //尾插法建表
{
scanf("%d",&c);
if(c!=0)
{
s=(Note*)malloc(sizeof(Note));
s->a=c; r->next=s; r=s;
}
else
{flag=0;r->next=NULL;}
}
int n,m;
printf("删除元素位置:");
scanf("%d",&n);
if(dele(L,n,&m))
{
printf("\n删除后:\n");
while(L->next!=NULL)
{ L=L->next; printf("%d ",L->a); }
}
else printf("\n删除位置错误\n");
printf("16031110208尚艳丽\n");
return 0;
}
2-3合并两个单链表,代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct Note
{
int a;
Note* next;
} Note,*list1;
void CF(list1 L) //创建单链表
{
Note *r,*s;
int flag=1,c;
r=L;
while(flag) //尾插法
{
scanf("%d",&c);
if(c!=0)
{ s=(Note*)malloc(sizeof(Note));
s->a=c; r->next=s; r=s;
}
else
{ flag=0; r->next=NULL; ;//将最后一个结点的next链域置为空表示结束 }
}
}
Note *mergelist(list1 LA,list1 LB) //合并单链表
{
Note *pa,*pb,*r;//pa,pb 分别指向两个单链表LA,LB中的第一个节点
list1 LC;
pa=LA->next; pb=LB->next;
LC=LA; LC->next=NULL; r=LC;
while(pa!=NULL&&pb!=NULL)//两个表未处理完时选择较小的值节点插入LC
{
if(pa->a <= pb->a)
{r->next=pa;r=pa;pa=pa->next;}
else
{r->next=pb;r=pb;pb=pb->next;}
}
if(pa) //表LA未完
r->next=pa;
else //表LB未完
r->next=pb;
free(LB);
return LC;
}
int main()
{
list1 LA,LB,LC;
LA=(list1)malloc(sizeof(Note));//初始化链表
LA->next=NULL;
LB=(list1)malloc(sizeof(Note));
LB->next=NULL;
printf("合并前:\n\n");
CF(LA); CF(LB);
LC=(list1)malloc(sizeof(Note)); //初始化
LC->next=NULL;
LC=mergelist(LA,LB);
printf("合并后:\n");
LC=LC->next;
while(LC!=NULL)
{ printf("%d ",LC->a); LC=LC->next; }
printf("\n16031110208尚艳丽\n");
return 0;
}
顺序表与链表操作
猜你喜欢
转载自blog.csdn.net/weixin_39531549/article/details/78161292
今日推荐
周排行