中易网

链表的建立,插入,删除C++代码

答案:1  悬赏:30  
解决时间 2021-04-27 23:49
  • 提问者网友:痞子房西
  • 2021-04-27 17:20
链表的建立,插入,删除C++代码
最佳答案
  • 二级知识专家网友:不羁的心
  • 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;

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息