#include <stdio.h>
#include <stdlib.h>
#define NN 12
#define MM 20
typedef int elemType;
struct sNode {
elemType date;
struct sNode *next;
};
/* 函数定义 */
/* 1.初始化线性表,即置单链表的表头指针为空 */
void initList(struct sNode* *hl);
/* 2.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 */
void clearList(struct sNode* *hl);
/* 3.返回单链表的长度 */
int sizeList(struct sNode *hl);
/* 4.检查单链表是否为空,若为空则返回1,否则返回0 */
int emptyList(struct sNode *hl);
/* 5.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行 */
elemType getElem(struct sNode *hl, int pos);
/* 6.遍历一个单链表 */
void traverseList(struct sNode *hl);
/* 7.从单链表中查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL */
elemType* findList(struct sNode *hl, elemType x);
/* 8.把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0 */
int updatePosList(struct sNode *hl, int pos, elemType x);
/* 9.向单链表的表头插入一个元素 */
void insertFirstList(struct sNode* *hl, elemType x);
/* 10.向单链表的末尾添加一个元素 */
void insertLastList(struct sNode* *hl, elemType x);
/* 11.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0 */
int insetPosList(struct sNode* *hl, int pos, elemType x);
/* 12.向有序单链表中插入元素x结点,使得插入后仍然有序 */
void insertOrderList(struct sNode* *hl, elemType x);
/* 13.从单链表中删除表头结点,并把该结点的值返回,若删除失败则停止程序运行 */
elemType deleteFirstList(struct sNode* *hl);
/* 14.从单链表中删除表尾结点并返回它的值,若删除失败则停止程序运行 */
elemType deleteLastList(struct sNode* *hl);
/* 15.从单链表中删除第pos个结点并返回它的值,若删除失败则停止程序运行 */
elemType deletePosList(struct sNode* *hl, int pos);
/* 16.从单链表中删除值为x的第一个结点,若删除成功则返回1,否则返回0 */
int deleteValueList(struct sNode* *hl, elemType x);
/* 函数实现 */
/* 1.初始化线性表,即置单链表的表头指针为空 */
void initList(struct sNode* *hl)
{
*hl = NULL;
return ;
}
/* 2.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 */
void clearList(struct sNode* *hl)
{
struct sNode *cp,*np;
cp = *hl;
if(!emptyList(*hl))
{
printf("原线性表为空,请退出重新选择!");
getchar();
getchar();
return ;
}
while(cp != NULL)
{
np = cp->next;
free(cp);
cp = np;
}
*hl=NULL;
}
/* 3.返回单链表的长度 */
int sizeList(struct sNode *hl)
{
int count=0;
if(!emptyList(hl))
{
printf("原线性表为空,请退出重新选择!");
getchar();
getchar();
return 0;
}
while(hl!=NULL)
{
count++;
hl = hl->next;
}
return count;
}
/* 4.检查单链表是否为空,若为空则返回1,否则返回0 */
int emptyList(struct sNode *hl)
{
if(hl != NULL)
{
return 0;
}
else
{
return 1;
}
}
/* 5.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行 */
elemType getElem(struct sNode *hl, int pos)
{
int count=0;
if(!emptyList(hl))
{
printf("原线性表为空,请退出重新选择!");
getchar();
getchar();
return 0;
}
while(hl != NULL)
{
count++;
if( pos == count)
{
break;
}
hl = hl->next;
}
if( count == 0 )
{
printf("此为空链表,退出程序!");
exit(1);
}
return hl->date;
}
/* 6.遍历一个单链表 */
void traverseList(struct sNode *hl)
{
if(!emptyList(hl))
{
printf("空链表,请退出重新选择!");
getchar();
getchar();
return ;
}
while( hl != NULL)
{
printf("%d ",hl->date);
hl = hl->next;
}
return ;
}
/* 7.从单链表中查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL */
elemType* findList(struct sNode *hl, elemType x)
{
if(!emptyList(hl))
{
printf("原线性表为空,请退出重新选择!");
getchar();
getchar();
return 0;
}
while ( hl != NULL)
{
if( hl->date == x)
{
return &hl->date;
}
hl = hl->next;
}
return NULL;
}
/* 8.把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0 */
int updatePosList(struct sNode *hl, int pos, elemType x)
{
int count = 0;
if(!emptyList(hl))
{
printf("原线性表为空,请退出重新选择!");
getchar();
getchar();
return 0;
}
while ( hl != NULL)
{
count++;
if( pos == count)
{
hl->date = x;
return 1;
}
hl = hl->next;
}
return 0;
}
/* 9.向单链表的表头插入一个元素 */
void insertFirstList(struct sNode* *hl, elemType x)
{
struct sNode *newP;
newP = malloc(sizeof(struct sNode));
if(newP == NULL)
{
printf("内存分配失败,退出运行!");
exit(1);
}
newP->date = x;
newP->next = *hl;
*hl = newP;
return ;
}
/* 10.向单链表的末尾添加一个元素 */
void insertLastList(struct sNode* *hl, elemType x)
{
struct sNode *newP;
newP = malloc(sizeof(struct sNode));
if(newP == NULL)
{
printf("内存分配失败,退出运行!");
exit(1);
}
newP->date = x;
newP->next = NULL;
if(*hl == NULL)
{
*hl = newP;
}
else
{
struct sNode *p = *hl;
while(p->next != NULL)
{
p = p->next;
}
p->next = newP;
}
return;
}
/* 11.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0 */
int insetPosList(struct sNode* *hl, int pos, elemType x)
{
int i = 0;
struct sNode *newP;
struct sNode *cp = *hl, *ap = NULL;
if(!emptyList(*hl))
{
printf("原线性表为空,请退出重新选择!");
getchar();
getchar();
return 0;
}
if(pos <= 0)
{
printf("pos值非法,返回0表示插入失败!");
return 0;
}
while(cp != NULL)
{
i++;
if(pos == i)
{
break;
}
else
{
ap = cp;
cp = cp->next;
}
}
newP = malloc(sizeof(struct sNode));
if(newP == NULL)
{
printf("内存分配失败,无法进行插入操作!");
return 0;
}
newP->date = x;
if(ap == NULL)
{
newP->next = cp;
*hl = newP;
}
else
{
newP->next = cp;
ap->next = newP;
}
return 1;
}
/* 12.向有序单链表中插入元素x结点,使得插入后仍然有序 */
void insertOrderList(struct sNode* *hl, elemType x)
{
int i,count = 0;
struct sNode *newP,*newQ,*swap,*p;
newP = malloc(sizeof(struct sNode));
swap = malloc(sizeof(struct sNode));
if(newP == NULL)
{
printf("内存分配失败,退出运行!");
exit(1);
}
if(!emptyList(*hl))
{
printf("原线性表为空,请退出重新选择!");
return ;
}
newP->date = x;
newP->next = *hl;
*hl = newP;
newP = *hl;
newQ = (*hl)->next;
p = *hl;
while(p != NULL)
{
count++;
p = p->next;
}
while(1)
{
for(i = 0; i<=count ;i++)
{
if(newQ == NULL)
{
newP = *hl;
newQ = (*hl)->next;
}
if(newP->date>newQ->date)
{
swap->date = newP->date;
newP->date= newQ->date;
newQ->date = swap->date;
}
newP = newP->next;
newQ = newQ->next;
}
if(count == 0)
{
break;
}
count --;
}
return ;
}
/* 13.从单链表中删除表头结点,并把该结点的值返回,若删除失败则停止程序运行 */
elemType deleteFirstList(struct sNode* *hl)
{
elemType tmpe;
struct sNode *cp = *hl;
if(*hl == NULL)
{
printf("单链表为空,无表头可进行删除,请退出重新选择!");
getchar();
getchar();
return 0;
}
tmpe = cp->date;
*hl =(*hl)->next;
free(cp);
return tmpe;
}
/* 14.从单链表中删除表尾结点并返回它的值,若删除失败则停止程序运行 */
elemType deleteLastList(struct sNode* *hl)
{
elemType temp;
struct sNode *cp = *hl;
struct sNode *ap = NULL;
while(cp->next != NULL)
{
ap = cp;
cp = cp->next;
}
if(ap == NULL)
{
*hl = (*hl)->next;
}
else
{
ap->next = NULL;
}
temp = cp ->date;
free(cp);
return temp;
}
/* 15.从单链表中删除第pos个结点并返回它的值,若删除失败则停止程序运行 */
elemType deletePosList(struct sNode* *hl, int pos)
{
int count = 0;
elemType temp =0;
struct sNode *cp = *hl,*ap = NULL;
if(cp == NULL)
{
printf("空链表,请退出重新选择!");
getchar();
getchar();
return 0;
}
if(pos == 1)
{
temp = (*hl)->date;
*hl = (*hl)->next;
return temp;
}
while(cp != NULL)
{
count++;
if(count == pos)
{
break;
}
ap = cp;
cp = cp->next;
}
if(pos != 1)
{
ap->next = cp->next;
}
temp = cp->date;
free(cp);
return temp;
}
/* 16.从单链表中删除值为x的第一个结点,若删除成功则返回1,否则返回0 */
int deleteValueList(struct sNode* *hl, elemType x)
{
struct sNode *cp = *hl;
struct sNode *ap = NULL;
while(cp != NULL)
{
if(cp->date ==x)
{
break;
}
ap = cp;
cp = cp->next;
}
if(cp == NULL)
{
return 0;
}
if(ap == NULL)
{
*hl = (*hl)->next;
}
else
{
ap->next = cp->next;
}
free(cp);
return 1;
}
void main()
{
int i,pos;
elemType x;
struct sNode *L;
while(1){
printf("1->初始化线性表\n2->清除线性表\n3->返回线性表长度\n4->判定线性表是否为空\n5->返回线性表L中第pos个元素的值\n");
printf("6->遍历输出线性表L中每个元素\n7->查找线性表L中与x相等元素并返回其位置\n8->把线性表L中第pos个元素的值修改为x的值\n");
printf("9->向线性表L的表头插入元素x\n10->向线性表L的表尾插入元素x\n11->向线性表L中第pos个元素位置插入元素x\n");
printf("12->向有序线性表L中插入元素x使得插入后仍然有序\n13->从线性表L中删除表头元素并返回它\n14->从线性表L中删除表尾元素并返回它\n");
printf("15->从线性表L中删除第pos个元素并返回它\n16->从线性表L中删除值为x的第一个元素\n");
printf("请选择操作:");
scanf("%d",&i);
while(i<1||i>16){
printf("输入操作不存在,重新输入");
scanf("%d",&i);
continue;
}
switch(i){
case 1:
printf("\n");
printf("1->初始化线性表");
initList(&L);
break;
case 2:
printf("\n");
printf("2->清除线性表");
clearList(&L);
break;
case 3:
printf("\n");
printf("3->返回线性表长度");
printf("线性表长度为%d",sizeList(L));
getchar();
getchar();
break;
case 4:
printf("\n");
printf("4->判定线性表是否为空:");
if(!emptyList(L)){
printf("线性表非空!");
}
else{
printf("线性表为空!");
}
getchar();
getchar();
break;
case 5:
printf("\n");
printf("5->返回线性表L中第pos个元素的值\n");
printf("请输入查询L线性表pos位置:");
scanf("%d",&pos);
printf("\n");
printf("线性表第%d个值为%d",pos,getElem(L,pos));
getchar();
getchar();
break;
case 6:
printf("\n");
printf("6->遍历输出线性表L中每个元素");
traverseList(L);
getchar();
getchar();
break;
case 7:
printf("\n");
printf("7->查找线性表L中与x相等元素并返回其位置\n");
printf("请输入查询x的值:");
scanf("%d",&x);
printf("\n");
printf("与x相等的表中位置为:%d",findList(L,x));
getchar();
getchar();
break;
case 8:
printf("\n");
printf("8->把线性表L中第pos个元素的值修改为x的值\n");
printf("请输入把线性表L位于pos值改为x:\n");
printf("请输入pos:");
scanf("%d",&pos);
printf("\n");
printf("请输入x:");
scanf("%d",&x);
updatePosList(L,pos,x);
break;
case 9:
printf("\n");
printf("9->向线性表L的表头插入元素x\n");
printf("请输入在表头插入的x值\n");
scanf("%d",&x);
insertFirstList(&L,x);
getchar();
getchar();
break;
case 10:
printf("\n");
printf("10->向线性表L的表尾插入元素x\n");
printf("请输入在表尾插入的x值:");
scanf("%d",&x);
insertLastList(&L,x);
getchar();
getchar();
break;
case 11:
printf("\n");
printf("11->向线性表L中第pos个元素位置插入元素x\n");
printf("请输入在表L中pos位置插入的x值\n");
printf("请输入pos:");
scanf("%d",&pos);
printf("\n");
printf("请输入x:");
scanf("%d",&x);
insetPosList(&L,pos,x);
getchar();
getchar();
break;
case 12:
printf("\n");
printf("12->向有序线性表L中插入元素x\n");
printf("请输入x:");
scanf("%d",&x);
insertOrderList(&L,x);
getchar();
getchar();
break;
case 13:
printf("\n");
printf("13->从线性表L中删除表头元素并返回它\n");
printf("被删除的表头元素为:%d",deleteFirstList(&L));
getchar();
getchar();
break;
case 14:
printf("\n");
printf("14->从线性表L中删除表尾元素并返回它");
printf("被删除的表尾元素为:%d",deleteLastList(&L));
getchar();
getchar();
break;
case 15:
printf("\n");
printf("15->从线性表L中删除第pos个元素并返回它\n");
printf("请输入在表L中删除的pos位置:");
printf("请输入pos:");
scanf("%d",&pos);
printf("\n");
printf("被删除的表中第%d个元素为:%d",pos,deletePosList(&L,pos));
getchar();
getchar();
break;
case 16:
printf("\n");
printf("16->从线性表L中删除值为x的第一个元素\n");
printf("请输入在表L中删除的x值:");
printf("请输入x:");
scanf("%d",&x);
deleteValueList(&L,x);
getchar();
getchar();
break;
}
system("cls");
}
}