/*呜呜希望大佬能指点错误,跪谢*/
一.顺序表
// 1)顺序表的基本操作:
typedef struct{
int number; //学号
char name[20]; //姓名
}ElemType;
typedef struct{
ElemType data[Max];
int length;
int listsize;
}Sqlist;
// 初始化
int initSqlist(Sqlist *L){
L->length=0;
L->listsize=Max;
return 1;
}
// 插入
int insertSqlist(Sqlist *L,int i,ElemType e){
int k;
if(i<1||i>L->length||L->length>=L->listsize){
printf("插入失败\n");
return 0;
}
else{
for(k=L->length-1;k>=i-1;k--)
L->data[k+1]=L->data[k];
L->data[i-1]=e;
L->length=L->length+1;
return 1;
}
}
// 创建
int creatSqlist(Sqlist *L){
int k,i;
ElemType e;
initSqlist(L);
printf("请输入创建信息数目\n");
scanf("%d",&k);
for(i=0;i<k;i++){
printf("请输入第%d条信息\n",i+1);
scanf("%d%s",&e.number,e.name);
getchar();
insertSqlist(L,i+1,e);
}
return 1;
}
// 删除
int deletSqlist(Sqlist *L,int i){
int k;
if(i<1||i>L->length||L->length==0){
printf("删除失败\n");
return 0;
}
else{
for(k=i-1;k<L->length-1;k++)
L->data[k]=L->data[k+1];
L->length--;
return 1;
}
}
// 查找
int locationSqlist(Sqlist L,char a[]){
int i;
if(L.length==0){
printf("空表,查找失败\n");
return 0;
}
else{
for(i=0;i<L.length;i++)
if(strcmp(L.data[i].name,a)==0) return i;
return 0;
}
}
// 修改
int changeSqlist(Sqlist *L,int i,char a[]){
if(i<1||i>L->length||L->length==0){
printf("修改失败\n");
return 0;
}
strcpy(L->data[i-1].name,a);
return 1;
}
// 遍历
int travelSqlist(Sqlist L){
int i;
if(L.length==0){
printf("空表,遍历失败\n");
return 0;
}
else{
for(i=0;i<L.length;i++)
printf("%d %s\n",L.data[i].number,L.data[i].name);
return 1;
}
}
// 输出
int outputSqlist(Sqlist L,int i){
if(i<1||i>L.length||L.length==0){
printf("输出失败\n");
return 0;
}
else{
printf("%d %s\n",L.data[i-1].number,L.data[i-1].name);
return 1;
}
}
// 有序归并
Sqlist combineSqlist(Sqlist L,Sqlist R){
Sqlist T;
int i;
initSqlist(&T);
int p=0,q=0;
while(p<L.length&&q<R.length){
if(L.data[p].number<R.data[q].number){
T.data[i++]=L.data[p];
p++;
}
else{
T.data[i++]=R.data[q];
q++;
}
}
while(p<L.length){
T.data[i++]=L.data[p];
p++;
}
while(q<R.length){
T.data[i++]=R.data[q];
q++;
}
return T;
}
二.单链表
// 2)带头结点单链表的基本操作:
typedef struct node{
int data;
struct node *next;
}Node,*LinkList;
//初始化
int initLinkList(LinkList *L){
(*L)=(LinkList)malloc(sizeof(Node));
if((*L)==NULL){
printf("初始化失败\n");
exit(0);
}
(*L)->next=NULL;
return 1;
}
// 插入(头插、尾插、任意位置插入)
//a.头插
int firstinsert(LinkList L,int a){
LinkList s;
s=(LinkList)malloc(sizeof(Node));
if(s==NULL){
printf("插入失败\n");
return 0;
}
s->data=a;
s->next=L->next;
L->next=s;
return 1;
}
//b.尾插(L是空表)
int lastinsert(LinkList L,int a){
LinkList s,R=L;
s=(LinkList)malloc(sizeof(Node));
if(s==NULL){
printf("插入失败\n");
return 0;
}
while(R->next!=NULL){
R=R->next;
}
s->data=a;
s->next=R->next;
R->next=s;
return 1;
}
//c.任意位置插入
int insert(LinkList L,int i,int a){
LinkList s,p=L;
int pos=0;
s=(LinkList)malloc(sizeof(Node));
if(s==NULL||i<1){
printf("插入失败\n");
return 0;
}
while(p!=NULL&&pos<i-1){
p=p->next;
pos++;
}
if(p==NULL){
printf("插入失败\n");
return 0;
}
s->data=a;
s->next=p->next;
p->next=s;
return 1;
}
// 创建(尾插法)
int creatLinkList(LinkList *L){
int i,m,a;
initLinkList(L);
printf("请输入要创建的数目\n");
scanf("%d",&m);
for(i=0;i<m;i++){
printf("请输入第%d个信息:\n",i+1);
scanf("%d",&a);
lastinsert(*L,a);
}
return 1;
}
// 删除(头删、尾删、任意位置删除)
//a.头删
int firstdelet(LinkList L){
LinkList p;
int m,i;
printf("请输入要删除的数目\n");
scanf("%d",&m);
for(i=0;i<m;i++){
p=L->next;
L->next=p->next;
free(p);
}
return 1;
}
//b.尾删
int lastdelet(LinkList L){
LinkList p=L,q=L->next;
while(q->next!=NULL){
p=p->next;
q=q->next;
}
p->next=q->next;
free(p);
return 1;
}
//c.任意位置删除
int delet(LinkList L,int i){
LinkList q=L,p;
int pos=0;
while(q->next!=NULL&&pos<i-1){
q=q->next;
pos++;
}
if(i<1||q->next==NULL){
printf("删除失败\n");
return 0;
}
p=q->next;
q->next=p->next;
free(p);
return 1;
}
// 查找
int locationLinkList(LinkList L,int a){
int i=1;
LinkList p=L->next;
while(p->data!=a&&p!=NULL){
i++;
p=p->next;
}
if(p==NULL){
printf("查找失败\n");
return 0;
}
printf("查找数值位置为:%d",i);
return 1;
}
// 修改
int changeLinkList(LinkList L,int i,int a){
int pos=0;
LinkList p=L;
while(p!=NULL&&pos<i){
pos++;
p=p->next;
}
if(p==NULL) return 0;
p->data=a;
return 1;
}
// 输出
int outputLinkList(LinkList L){
LinkList p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
return 1;
}
// 求表长
int lengthLinkList(LinkList L){
int i=0;
LinkList p=L;
while(p!=NULL){
i++;
p=p->next;
}
printf("表长%d\n");
return 1;
}
// 逆序
int inverLink(LinkList L){
LinkList p=L->next;
L->next=NULL;
while(p!=NULL){
firstinsert(L,p->data);
p=p->next;
}
return 1;
}
// 有序插入(从小到大)
int youxuinsert(LinkList L,int a){
LinkList p=L,s;
s=(LinkList)malloc(sizeof(Node));
s->data=a;
while(p->next!=NULL){
if(a<p->next->data) {
s->next=p->next;
p->next=s;
break;
}
p=p->next;
}
if(p->next==NULL){
s->next=p->next;
p->next=s;
}
return 1;
}
// 单链表的有序归并
LinkList unionLinkList(LinkList L,LinkList R){
LinkList p=L->next,q=R->next,T,t=T,s;
initLinkList(&T);
while(p!=NULL&&q!=NULL){
s=(LinkList)malloc(sizeof(Node));
if(p->data<q->data){
s->data=p->data;
s->next=t->next;
t->next=s;
t=s;
q=q->next;
}
if(p->data>=q->data){
s->data=p->data;
s->next=t->next;
t->next=s;
t=s;
p=p->next;
}
}
while(p!=NULL){
s=(LinkList)malloc(sizeof(Node));
s->data=p->data;
s->next=t->next;
t->next=s;
t=s;
p=p->next;
}
if(q!=NULL){
s=(LinkList)malloc(sizeof(Node));
s->data=p->data;
s->next=t->next;
t->next=s;
t=s;
q=q->next;
}
return T;
}