| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 697 人关注过本帖
标题:求单链表讲解
取消只看楼主 加入收藏
aKARL
Rank: 1
等 级:新手上路
帖 子:36
专家分:6
注 册:2013-7-1
结帖率:20%
收藏
已结贴  问题点数:20 回复次数:0 
求单链表讲解
今天在论坛上搜到一段程序
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define N 100
#define OK 1
#define Error 0
int yes=0;
typedef char elemtype;
typedef struct lnode
{
     char data;
     struct lnode *next;
}lnode,*linklist;
void createlist(linklist *l)
{
     int i,n;
     linklist p;
     char ch;
     printf("请输入单链表的长度:\n");
     scanf("%d",&n);
     *l=(linklist)malloc(sizeof(lnode));
     (*l)->next=NULL;
     printf("请输入单链表中元素:\n");
     for(i=n;i>0;i--)
     {
         p=(linklist)malloc(sizeof(lnode));
         scanf("%c",&ch);
         if((ch=getchar())!='\n')
         {
             p->data=ch;
             p->next=(*l)->next;
             (*l)->next=p;
         }
     }
     yes=1;
}
int length(linklist *l)
{
     int i=0;
     linklist p;
     p=(*l)->next;
     while(p!=NULL)
     {
         i++;
         p=p->next;
     }
     return i;
}
display(linklist *l)
{
     linklist q;
     int i;
     printf("此时单链表元素:\n");
     for(i=1;i<=length(l);i++)
     {
         printf("%3d",i);
     }
     printf("\n");
     q=(*l)->next;
     while(q)
     {
         printf("%3c",q->data);
         q=q->next;
     }
     printf("\n");
}
listdelete(linklist l,int i,char*e)
{
     linklist p=l,q;
     int j=0;
     while(p&&j<i-1)
     {
         p=p->next;
         j++;
     }
     if(!p||j>i-1)
         return -1;
     q=p->next;
     *e=q->data;
     free(q);
     return *e;
}
int listinsert(linklist l,int i,char e)
{
     linklist p=l,s;
     int j=0;
     while(p&&j<i-1)
     {
         p=p->next;
         j++;
     }
     if(!p||j>i-1)
         return -1;
     s=(linklist)malloc(sizeof(lnode));
     s->data=e;
     s->next=p->next;
     p->next=p->next;
     p->next=s;
     return OK;
}
destroylist(linklist l)
{
     linklist p=l,q=l->next;
     while(q)
     {
         free(p);
         p=q;
         q=q->next;
     }
     free(q);
     yes;
}
listempty(linklist l)
{
     return (l->next==NULL);
}
void menu()
{
     printf("                 单链表基本操作实验                   \n");
     printf("******************************************************\n");
     printf("请选择命令序号(0-7):                                 *\n");
     printf("*1创建链表;                                   *\n");
     printf("*2链表插入;                                          *\n");
     printf("*3链表删除;                                          *\n");
     printf("*4求链表长度;                                        *\n");
     printf("*5判断链表是否为空;                                  *\n");
     printf("*6链表输出;                                          *\n");
     printf("*7单链表销毁;                                        *\n");
     printf("*0程序结束.                                          *\n");
     printf("******************************************************\n");
}
void function()
{
     linklist l;
     int i,sel;
     char ch,e;
     while(l)
     {
         menu();
         printf("请输入命令号(0-7):\n");
         scanf("%d",&sel);
         switch(sel)

        {
             case 1:
                 {
                     createlist(&l);
                     printf("单链表创建成功!\n");
                     break;
                 }
             case 2:if(yes==0)
                    {
                        printf("此时表未创建!不能插入元素!\n");
                        break;
                    }
                 else
                 {
                     printf("请输入要插入的位置:\n");
                     scanf("%d",&i);
                     printf("请输入要插入的值:\n");
                     scanf("%c",&e);
                     if((e=getchar())!='\n')
                         listinsert(l,i,e);
                     break;
                 }
             case 3:if(yes==0)
                    {
                        printf("此时表未创建!不能删除元素!\n");
                        break;
                    }
                 else
                 {
                     printf("请输入要删除位置:\n");
                     scanf("%d",&i);
                     listdelete(l,i,&ch);
                     break;
                 }
             case 4:if(yes==0)
                    {
                        printf("此时表未创建!不能求单链表长度!\n");
                        break;
                    }
                 else
                 {
                     printf("单链表的长度是%d\n",length(&l));
                     break;
                 }
             case 5:if(yes==0)
                    {
                        printf("此时表未创建!\n");
                        break;
                    }
                 else if(listempty(l))
                     printf("当前的单链表是空表!\n");
                 else
                     printf("当前单链表为非空表!\n");
                 break;
             case 6:if(yes==0)
                    {
                        printf("此时表未创建!不能输出线性表!\n");
                        break;
                    }
                 else
                 {
                     display(&l);
                     break;
                 }
             case 7:if(yes==0)
                    {
                        printf("此时表未创建!不能销毁单链表!\n");
                        break;
                    }
                 else
                 {
                     destroylist(l);
                     printf("单链表已被销毁!\n");
                     break;
                 }
             case 0:exit(1);break;
             default:
                 printf("输入命令错误!请重新输入:\n");
                 break;
         }
     }
}
int main(void)
{
     function();
     return OK;
}




说实话,似乎没太看懂
who能把他改成用指针的插入删除呢。。。。。。。。最好附上解释,不然这一次过关了下次还是不会
搜索更多相关主题的帖子: 元素 include 
2013-09-27 09:33
快速回复:求单链表讲解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015600 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved