顺序表 对链表的基本操作
#include<stdio.h>
#include<stdlib.h> //导入malloc函数所需要的头文件
#define ERROR 0
#define TRUE 1
typedef bool status;
//对线性表的结构化描述
typedef struct Node{
int data;
struct Node *next;
}Node;
//头插法建立一个当链表
status createlistF(Node *&C)
{
Node *s;
int x;
printf("请输入您需要用头插法输入的数,输入0表示终止\n");
while(true){
scanf("%d",&x);
if(x==0)
break;
else
s=(Node *)malloc(sizeof(Node));
s->data=x;
s->next=C->next;
C->next=s;
}
return TRUE;
}
//尾插法建立一个单链表
status createlistR(Node *&C)
{
Node *s,*r;
int x;
r=C;
//r的指针向后移 直到r所指元素为空为止 否则之前插入的元素会被覆盖
while(true){
if(r->next==NULL)
break;
else
r=r->next;}
printf("请输入您需要用尾插法输入的数,输入0表示终止\n");
while(true){
scanf("%d",&x);
if(x==0)
break;
else
s=(Node *)malloc(sizeof(Node));
s->data=x;
r->next=s;
r=r->next;
}
r->next=NULL;
return TRUE;
}
//求单链表的表长
int listlength(Node *C)
{
int length=-1; //含有头结点
Node *r;
r = C;
while(r!=NULL){
r=r->next;
length++;
}
return length;
}
//删除单链表的第几个元素
status deletenumber1(Node *C ,int number){
//r为s的前驱元素 真正要删除的阶段为s所指的元素
Node *r ,*s;
r = C;
for(int i=0;i<number-1;i++){
r=r->next;
}
s=r->next;
r->next=s->next;
return TRUE;
}
//删除单链表中值为x元素
status deletenumber2(Node *C ,int number){
//r为s的前驱元素 真正要删除的阶段为s所指的元素
Node *r ,*s;
r = C;
r=r->next;
for(;;){
if(r->next->data==number){
s=r->next;
r->next=s->next;
break;
}
if(r->next->data!=number && r->next->next==NULL){
printf("您输入要删除的元素有误,请你重新输入\n");
break;
}
r=r->next;
}
return TRUE;
}
//输出链表中的元素
status printfs(Node *C)
{
Node *r;
r = C;
r = r->next;
while(r!=NULL){
printf("%d ",r->data);
r=r->next;
}
printf("\n");
return TRUE;
}
void main(){
Node *C;
int choose;
//建立链表c的头结点 并初始化
C=(Node *)malloc(sizeof(Node));
C->next=NULL;
printf("1.头插入元素\n");
printf("2.尾插入元素\n");
printf("3.求线性表的长度\n");
printf("4.按序号删除单链表中的元素\n");
printf("5.按值删除单链表中的元素\n");
printf("6.打印顺序表\n");
while(true){
printf("请输入您的选择");
scanf("%d", &choose);
switch(choose){
//采用头插法插入元素
case 1:
createlistF(C);
break;
//采用尾插法插入元素
case 2:
createlistR(C);
break;
//求线性表的长度
case 3:
printf("线性表的长度是%d\n",listlength(C));
break;
//按序号删除单链表中的元素
case 4:
int number;
printf("请输入您要删除的元素序号,范围为1-%d\n",listlength(C));
scanf("%d",&number);
deletenumber1(C,number);
printfs(C);
break;
//按值删除单链表中的元素
case 5:
int number1;
printf("请输入您要删除的元素的值");
printfs(C);
scanf("%d",&number1);
deletenumber2(C,number1);
printfs(C);
break;
//输出线性表
case 6:
printfs(C);
break;
}
}
}