麦吉尔大学:顺序表的基本操作

来源:百度文库 编辑:九乡新闻网 时间:2024/04/27 14:40:37
数字顺序表#include
#include /* 定义ElemType为int类型 */
typedef int ElemType;
#define TRUE 1
#define FALSE 0
#define flag -1 /* 单链表的结点类型 */
typedef struct LNode
{ElemType data;
struct LNode *next;
} LNode,*LinkedList; /* 初始化单链表 */
LinkedList LinkedListInit()
{LinkedList L;
L=(LinkedList)malloc(sizeof(LNode));
L->next=NULL;
return L;
} /* 清空单链表 */
void LinkedListClear(LinkedList L)
{L->next=NULL;
printf("链表已经清空\n");
} /* 检查单链表是否为空 */
int LinkedListEmpty(LinkedList L)
{if(L->next==NULL) return TRUE;
else return FALSE;
} /* 遍历单链表 */
void LinkedListTraverse(LinkedList L)
{LinkedList p;
p=L->next;
if(p==NULL) printf("单链表为空表\n");
else
{printf("链表中的元素为:\n");
while(p!=NULL)
{printf("%d ",p->data); p=p->next;}
}
printf("\n");
} /* 求单链表长度 */
int LinkedListLength (LinkedList L)
{LinkedList p;
int j;
p=L->next;
j=0;
while(p!=NULL)
{ j++;p=p->next; }
return j;
} /* 从链表中查找元素 */
LinkedList LinkedListGet(LinkedList L,int i)
{LinkedList p;int j;
p=L->next; j=1;
while (p!=NULL && j{p=p->next; j++; }
if (j==i) return p;
else return NULL;
} /* 从链表中查找与给定元素值相同的元素在顺序表中的位置 */
int LinkedListLocate ( LinkedList L, ElemType x)
{LinkedList p;int j;
p=L->next; j=1;
while ( p!=NULL && p->data != x)
{p=p->next;j++;}
if(p) return j;
else return 0;
} /* 向链表中插入元素 */
void LinkedListInsert(LinkedList L, int i, ElemType x)
{LinkedList p,s;
int j;
j=1;p=L;
while(p&&j{p=p->next;j++;}
if(p==NULL||j>i)
printf("插入位置不正确\n");
else {s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=p->next;
p->next=s;
printf("%d已插入到链表中\n",x);
}
} /* 从链表中删除元素 */
void LinkedListDel(LinkedList L,int i)
{ LinkedList p,q;
int j;
j=1;p=L;
while(p->next&&j{p=p->next;j++;}
if(p->next==NULL)
printf("删除位置不正确\n");
else {q=p->next;p->next=q->next;free(q);
printf("第%d个元素已从链表中删除\n",i);
}
}
/*建立单链表*/
LinkedList LinkedListCreat( )
{ LinkedList L=LinkedListInit(),p,r;
ElemType x;
r=L;
printf("请依次输入链表中的元素,输入-1结束\n");
scanf("%d",&x);
while (x!=flag)
{p=(LinkedList)malloc(sizeof(LNode));
p->data=x;
r->next=p;
r=p;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
int scan()
{int d;
printf("请选择要进行的操作\n");
printf("1.初始化 2.清空 3.求链表长度 4.检查链表是否为空\n");
printf("5.遍历链表 6.从链表中查找元素\n");
printf("7.从链表中查找与给定元素值相同的元素在顺序表中的位置\n");
printf("8.向链表中插入元素 9. 从链表中删除元素\n");
printf("10.建立单链表\n");
printf("其他键退出。。。。。\n");
scanf("%d",&d);
return(d);
} void main()
{
int quit=0;
int i,locate;
ElemType e;
LinkedList L,p;
while(!quit)
switch(scan())
{case 1:L=LinkedListInit();printf("\n");break;
case 2:LinkedListClear(L);printf("\n");break;
case 3:printf("链表的长度为 %d\n",LinkedListLength(L));break;
case 4:if(LinkedListEmpty(L))printf("链表为空\n");else printf("链表非空\n");break;
case 5:LinkedListTraverse(L);
break;
case 6:printf("请输入待查询元素在链表中的位置:");
scanf("%d",&i);
p=LinkedListGet(L,i);
if(p) printf("链表中第%d个元素的值为:%d\n",i,p->data);
else printf("查询位置不正确\n");
break;
case 7:printf("请输入待查询元素的值:");
scanf("%d",&e);
locate=LinkedListLocate(L,e);
if(locate)
printf("%d在链表中的位置是:%d\n",e,locate);
else printf("链表中没有值为%d的元素\n",e);
break;
case 8:printf("请输入插入元素的位置和值(中间以空格或回车分隔):\n");
scanf("%d%d",&i,&e);
LinkedListInsert(L,i,e);
break;
case 9:if(LinkedListLength(L)==0)
printf("链表已经为空,不能删除\n");
else {printf("请输入待删除元素的位置:\n");
scanf("%d",&i);
LinkedListDel(L,i);}
break;
case 10:L=LinkedListCreat();
printf("\n");break;
default:quit=1;}
} 字母顺序表#include
#include
#define maxsize 100
typedef char elemtype;
typedef struct
{int listsize;
elemtype *elem;
int length;
}sqlist;                       /*顺序表类型定义*/
void creat_list(sqlist *l,int n)                                              /*1顺序表的初始化*/
{
int i;
l->elem=(char*)malloc(maxsize*sizeof(char));
l->length=0;  //初始容量
l->listsize=maxsize;  //最大容量
printf("请依次输入%d个元素",n);
for(i=0;i<=n;i++)
{scanf("%c",&(l->elem[i]));
 (l->length)++;}
}void printlist(sqlist *l)  //输出顺序表元素
{
int i;
printf("顺序表为:");
for(i=0;ilength;i++)
printf("%c",l->elem[i]);
printf("\n");
}
void listdelete(sqlist *l,int i)                /*顺序表L中删除第I个元素*/
{
int j;
for(j=i;jlength-1;j++)
l->elem[j]=l->elem[j+1];
(l->length)--;
}void listinsert(sqlist *l,int i,elemtype e)         /*9在顺序表L中第I个位置上插入元素E*/
{
int j;
(l->length)++; /*顺序表长度增1*/
for(j=l->length;j>i;j--)             /*将elem[i]及后面元素后移一个位置*/
   l->elem[j]=l->elem[j-1];
     l->elem[i]=e;                  
}int locateelem(sqlist *l,elemtype e)            /*在顺序表L中查找元素E*/
{
int i=0;
while(ilength&&l->elem[i]!=e) i++;
if(i>=l->length)
   return 0;
else
   return i;
}int choose()
{int d;
printf("请选择要进行的操作\n");
printf("初始化(1)\n输出列表(2)\n");
printf("查询元素(3)\n");
printf("从链表中删除元素(4)\n向链表中插入元素(5)\n:");
printf("其他键退出\n");
scanf("%d",&d);
return(d);
}
void main()
{
sqlist l;
elemtype e,m;
int i,n,p,f;
f=0;
 while(!f)
switch(choose())
{
case 1:printf("请输入该顺序表的长度(小100):\n");
scanf("%d",&n);
creat_list(&l,n);
printf("\n");break;
case 2:printlist(&l);break;
case 3:printf("请输入要查询的字母\n");
scanf("%c",&e);
e=getchar();
printf("元素的位置%c=%d\n",e,locateelem(&l,e));
break; case 4:printf("请输入删除元素的位置:\n");
scanf("%d",&i);
listdelete(&l,i);
printlist(&l);
break; case 5:printf("请输入要插入位置n和元素m\n");
scanf("%d %c",&n,&m);
if(n<1||n>l.length)
printf("ERROR");
else if(l.length>=l.listsize) printf("ERROR");
else {listinsert(&l,n,m);printlist(&l);}
break;
default :f=1;
}
}