链表的建立,插入,删除C++代码
- 提问者网友:痞子房西
- 2021-04-27 17:20
- 二级知识专家网友:不羁的心
- 2021-04-27 18:40
#include <stdio.h>
#include <stdlib.h>
#define ElemType int
typedef struct lnode{
ElemType date;
struct lnode *next;
}lnode,*linklist;
linklist initlist(void){ //链式表的初始化函数
linklist head;
linklist p,q;
ElemType flag;
p=(linklist)malloc(sizeof(struct lnode));
head=q=p;
if(!p){
printf("ERROR!\n");
exit(0);
}
scanf("%d",&p->date);
flag=p->date;
p->next=NULL;
if(flag==0){exit(0);}
while(flag!=0){
p=(linklist)malloc(sizeof(struct lnode));
if(!p){
printf("ERROR!\n");
exit(0);
}
scanf("%d",&p->date);
flag=p->date;
if(flag==0){break;}
else{
q->next=p;
q=p;
p->next=NULL;
}
}
return(head);
}
linklist insert(linklist head,int i,ElemType e){ //插入元素函数
linklist p1,p2,q;
p1=head;
if(1==i){
q=(linklist)malloc(sizeof(struct lnode));
q->date=e;
q->next=p1;
head=q;
}
else{
while(i!=1&&p1!=NULL){
p2=p1;
p1=p2->next;
i--;
}
if(p1==NULL&&i!=1){
printf("ERROR!");
}
if(i==1){
q=(linklist)malloc(sizeof(struct lnode));
q->date=e;
p2->next=q;
q->next=p1;
}
}
return(head);
}
void print(linklist head){ //输出函数
linklist p;
for(p=head;p!=NULL;p=p->next){
printf("%d ",p->date);
}
}
void lisedel(linklist head){
linklist p1,p2;
int i;
scanf("%d",&i); //输入要删除的元素的位置
p1=head;
if(1==i){
head=p1->next;
//free(p1);
}
else{
while(i!=1&&p1!=NULL){
p2=p1;
p1=p2->next;
i--;
}
if(p1==NULL&&i!=1){
printf("ERROR!");
}
if(i==1){
p2->next=p1->next;
free(p1);
}
}
}
linklist nizhi(linklist head){ //逆置线型表
linklist p1,p2,p3,tail;
tail=head;
p1=head;
p2=p1->next;
p3=p2->next;
tail->next=NULL;
while(1){
p2->next=p1;
p1=p2;
p2=p3;
p3=p3->next;
if(p3==NULL){
head=p2;
p2->next=p1;
break;
}
}
return head;
}
int main(){
printf(" 单链顺序表\n");
linklist head;
int i=1,flag=0;
ElemType e;
while(i!=0){
printf("\n请选择所要进行的操作:\n");
printf(" 0.初始化链式线型表(以输入0结束)\n");
printf(" 1.插入新的元素\n");
printf(" 2.删除所选的元素\n");
printf(" 3.逆置链式线型表\n");
printf(" 4.输出表中的现有元素\n");
printf("请选择:");
scanf("%d",&i);
switch(i){
case 0: printf("请输入初始化的元素:\n");
head=initlist();
i=1;flag=1;break;
case 1: if(flag==1){
printf("输入要插入的位置和值:\n");
scanf("%d%d",&i,&e); //输入要插入的位置和值
head=insert(head,i,e); //插入新的元素
}
else {
printf(" ERROR,请先选择0初始化链表!");
}
i=1;break;
case 2: if(flag==1){
printf("输入要删除的元素的位置:\n");
lisedel(head);
}
else {
printf(" ERROR,请先选择0初始化链表!");
}
i=1;break;
case 3: if(flag==1){
head=nizhi(head);
printf("逆置成功!");
}
else {
printf(" ERROR,请先选择0初始化链表!");
}
i=1;break;
case 4: if(flag==1){
print(head);
}
else {
printf(" ERROR,请先选择0初始化链表!");
}
i=1;break;
}
}
return 0;
}