鱼C论坛

 找回密码
 立即注册
查看: 2767|回复: 5

单链表几个基本操作的实现

[复制链接]
发表于 2016-10-15 22:48:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
输出的时候前面多出那些数字怎么回事??而且插入数据之后再输出,所插入的数值也有错误。。求解
0.png
  1. #include<iostream>
  2. using namespace std;
  3. #define OK 1
  4. #define ERROR 0
  5. typedef int Status;
  6. typedef int ElemType;
  7. typedef struct LNode
  8. {
  9.         ElemType data;                //结点的数据域
  10.         struct LNode *next;           //结点的指针域
  11. }LNode,*LinkList;

  12. Status CreateList_H(LinkList &L,int n)         //前插法创建单链表
  13. {
  14.         LNode *p;
  15.         L=new LNode;
  16.         L->next=NULL;                        //构造一个带头结点的空链表
  17.         for(int i=0; i<n; ++i)
  18.         {
  19.                 p=new LNode;
  20.                 cin>>p->data;
  21.                 p->next=L->next;
  22.                 L->next=p;
  23.         }
  24.         return OK;
  25. }

  26. Status CreateList_R(LinkList &L,int n)         //后插法创建单链表
  27. {
  28.         LNode *p,*r;
  29.         L=new LNode;
  30.         L->next=NULL;                        //构造一个带头结点的空链表
  31.         r=L;
  32.         for(int i=0; i<n; ++i)
  33.         {
  34.                 p=new LNode;
  35.                 cin>>p->data;
  36.                 p->next=NULL;
  37.                 r->next=p;
  38.                 r=p;
  39.         }
  40.         return OK;
  41. }

  42. LNode *LocatElem(LinkList L,ElemType e)       //在单链表中查找值为e的元素
  43. {
  44.         LNode *p;
  45.         p=L->next;
  46.         while(p && p->data!=e)
  47.                 p=p->next;
  48.         return p;
  49. }

  50. Status ListInsert(LinkList &L,int i,ElemType e)       //在单链表中第i个位置插入值为e的新结点
  51. {
  52.         LNode *s,*p=L;
  53.         int j=0;
  54.         while(p && (j<i-1))
  55.         {
  56.                 p=p->next;
  57.                 ++j;
  58.         }
  59.         if(!p || (j>i-1))
  60.                 return ERROR;
  61.         s=new LNode;
  62.         s->next=p->next;
  63.         p->next=s;
  64.         return OK;
  65. }

  66. Status ListDelete(LinkList &L,int i)        //在单链表中删除第i个元素
  67. {
  68.         LNode *p=L;
  69.         int j=0;
  70.         while(p->next && (j<i-1))
  71.         {
  72.                 p=p->next;
  73.                 j++;
  74.         }
  75.         if(!(p->next) || (j>i-1))
  76.                 return ERROR;
  77.         LNode *q=p->next;
  78.         p->next=q->next;
  79.         delete q;
  80.         return OK;
  81. }

  82. void TraveseList(LinkList L)         //输出单链表的各个结点
  83. {
  84.         LNode *p=L;
  85.         if(p==NULL)
  86.         return;
  87.         else
  88.         {
  89.                 cout<<p->data<<" ";
  90.                 TraveseList(p->next);
  91.         }
  92. }
  93. int main()
  94. {
  95.         LNode *L,*p;
  96.         char ch;
  97.         int choose=-1, i, e, n;
  98.         cout<<"1.创建单链表\n2.查找\n3.插入\n4.删除\n5.输出\n0.退出"<<endl;
  99.         while(choose!=0)
  100.         {
  101.                 cout<<"请选择:";
  102.                 cin>>choose;
  103.                 switch(choose)
  104.                 {
  105.                 case 1:
  106.                         {
  107.                                 cout<<"请输入要输入的数据个数: ";
  108.                                 cin>>n;
  109.                 cout<<"请选择:\na.前插法创建单链表\nb.后插法创建单链表"<<endl;
  110.                                 cin>>ch;
  111.                                 cout<<"请输入数据: ";
  112.                                 if(ch=='a')
  113.                                 {
  114.                                         if(CreateList_H(L,n))
  115.                                                 cout<<"创建单链表成功!"<<endl;
  116.                                         else
  117.                                                 cout<<"创建单链表失败!"<<endl;
  118.                                 }
  119.                                 if(ch=='b')
  120.                                 {
  121.                                         if(CreateList_R(L,n))
  122.                                                 cout<<"创建单链表成功!"<<endl;
  123.                                         else
  124.                                                 cout<<"创建单链表失败!"<<endl;
  125.                                 }break;
  126.                         }
  127.                 case 2:
  128.                         {
  129.                                 cout<<"请输入要查找的值: "<<endl;
  130.                                 cin>>e;
  131.                                 if(p=LocatElem(L,e))
  132.                                         cout<<e<<"的地址是"<<p<<endl;
  133.                                 else
  134.                                         cout<<"查找失败!"<<endl;
  135.                         }break;
  136.                 case 3:
  137.                         {
  138.                                 cout<<"请分别输入要插入的值及位置: "<<endl;
  139.                                 cin>>e>>i;
  140.                                 if(ListInsert(L,i,e))
  141.                                 {                       
  142.                                         cout<<"插入成功!"<<endl;
  143.                                         ++n;
  144.                                 }
  145.                                 else
  146.                                         cout<<"插入失败!"<<endl;
  147.                         }break;
  148.                 case 4:
  149.                         {
  150.                                 cout<<"请输入要删除的元素位置: "<<endl;
  151.                                 cin>>i;
  152.                                 if(ListDelete(L,i))
  153.                                 {       
  154.                                         cout<<"已删除!"<<endl;
  155.                                         --n;
  156.                                 }
  157.                                 else
  158.                                         cout<<"删除失败!"<<endl;
  159.                         }break;
  160.                 case 5:
  161.                         {
  162.                                 TraveseList(L);
  163.                                 cout<<endl;
  164.                         }break;
  165.                 }
  166.         }
  167.         return 0;
  168. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-16 00:18:56 | 显示全部楼层
这类问题,自己调试一下就发现问题了吧

#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
        ElemType data;                //结点的数据域
        struct LNode *next;           //结点的指针域
}LNode,*LinkList;

Status CreateList_H(LinkList &L,int n)         //前插法创建单链表
{
        LNode *p;
        L=new LNode;
        L->next=NULL;                        //构造一个带头结点的空链表
        for(int i=0; i<n; ++i)
        {
                p=new LNode;
                cin>>p->data;
                p->next=L->next;
                L->next=p;
        }
        return OK;
}

Status CreateList_R(LinkList &L,int n)         //后插法创建单链表
{
        LNode *p,*r;
        L=new LNode;
        L->next=NULL;                        //构造一个带头结点的空链表
        r=L;
        for(int i=0; i<n; ++i)
        {
                p=new LNode;
                cin>>p->data;
                p->next=NULL;
                r->next=p;
                r=p;
        }
        return OK;
}

LNode *LocatElem(LinkList L,ElemType e)       //在单链表中查找值为e的元素
{
        LNode *p;
        p=L->next;
        while(p && p->data!=e)
                p=p->next;
        return p;
}

Status ListInsert(LinkList &L,int i,ElemType e)       //在单链表中第i个位置插入值为e的新结点
{
        LNode *s,*p=L;
        int j=0;
        while(p && (j<i-1))
        {
                p=p->next;
                ++j;
        }
        if(!p || (j>i-1))
                return ERROR;
        s=new LNode;
        s->next=p->next;
        p->next=s;
        return OK;
}

Status ListDelete(LinkList &L,int i)        //在单链表中删除第i个元素
{
        LNode *p=L;
        int j=0;
        while(p->next && (j<i-1))
        {
                p=p->next;
                j++;
        }
        if(!(p->next) || (j>i-1))
                return ERROR;
        LNode *q=p->next;
        p->next=q->next;
        delete q;
        return OK;
}

void TraveseList(LinkList L)         //输出单链表的各个结点
{
        LNode *p=L;
        if(p==NULL)
        return;
        else
        {
                cout<<p->data<<" ";
                TraveseList(p->next);
        }
}
int main()
{
        LNode *L,*p;
        char ch;
        int choose=-1, i, e, n;
        cout<<"1.创建单链表\n2.查找\n3.插入\n4.删除\n5.输出\n0.退出"<<endl;
        while(choose!=0)
        {
                cout<<"请选择:";
                cin>>choose;
                switch(choose)
                {
                case 1:
                        {
                                cout<<"请输入要输入的数据个数: ";
                                cin>>n;
                cout<<"请选择:\na.前插法创建单链表\nb.后插法创建单链表"<<endl;
                                cin>>ch;
                                cout<<"请输入数据: ";
                                if(ch=='a')
                                {
                                        if(CreateList_H(L,n))
                                                cout<<"创建单链表成功!"<<endl;
                                        else
                                                cout<<"创建单链表失败!"<<endl;
                                }
                                if(ch=='b')
                                {
                                        if(CreateList_R(L,n))
                                                cout<<"创建单链表成功!"<<endl;
                                        else
                                                cout<<"创建单链表失败!"<<endl;
                                }break;
                        }
                case 2:
                        {
                                cout<<"请输入要查找的值: "<<endl;
                                cin>>e;
                                if(p=LocatElem(L,e))
                                        cout<<e<<"的地址是"<<p<<endl;
                                else
                                        cout<<"查找失败!"<<endl;
                        }break;
                case 3:
                        {
                                cout<<"请分别输入要插入的值及位置: "<<endl;
                                cin>>e>>i;
                                if(ListInsert(L,i,e))
                                {                        
                                        cout<<"插入成功!"<<endl;
                                        ++n;
                                }
                                else
                                        cout<<"插入失败!"<<endl;
                        }break;
                case 4:
                        {
                                cout<<"请输入要删除的元素位置: "<<endl;
                                cin>>i;
                                if(ListDelete(L,i))
                                {        
                                        cout<<"已删除!"<<endl;
                                        --n;
                                }
                                else
                                        cout<<"删除失败!"<<endl;
                        }break;
                case 5:
                        {
                            //    TraveseList(L);
                                TraveseList(L->next);
                                cout<<endl;
                        }break;
                }
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-16 00:20:22 | 显示全部楼层
不要忘记你创建的是带头结点的空链表

Status CreateList_R(LinkList &L,int n)         //后插法创建单链表
{
        LNode *p,*r;
        L=new LNode;
        L->next=NULL;                        //构造一个带头结点的空链表
        r=L;
        for(int i=0; i<n; ++i)
        {
                p=new LNode;
                cin>>p->data;
                p->next=NULL;
                r->next=p;
                r=p;
        }
        return OK;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-10-16 18:29:18 | 显示全部楼层
人造人 发表于 2016-10-16 00:18
这类问题,自己调试一下就发现问题了吧

#include

嗯,我知道是这个问题,但是想不到是在TraveseList(L->next)这里改,一开始老在TraveseList函数那里的p后面加->next ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-16 18:44:10 | 显示全部楼层
zhyin 发表于 2016-10-16 18:29
嗯,我知道是这个问题,但是想不到是在TraveseList(L->next)这里改,一开始老在TraveseList函数那里的p后 ...

其实这样改也不好,
最好是修改TraveseList的内部
那么,这样
TraveseList(L);
就可以了,不用每次都加L->next
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-17 22:53:26 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 12:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表