C语言创建链表,函数调用部分

代码太长。我分次发。#include<stdio.h>#include<malloc.h>#include<stdlib.h>//定义数据类型名称typedefintDa... 代码太长。我分次发。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

//定义数据类型名称
typedef int DataType;

#define flag -1 //定义数据输入结束的标志数据

//单链表结点存储结构定义
typedef struct Node
{
DataType data;
struct Node *next;
}LNode ,*LinkList;

//建立单链表子函数
void Create_LinkList(LinkList L,DataType x)
{
LNode *s; //定义指向当前插入元素的指针
while(x!=flag)
{
s= (LinkList)malloc(sizeof(LNode)); //为当前插入元素的指针分配地址空间
s->data =x;
s->next =L->next ;
L->next =s;
scanf("%d",&x);
}
}
//查找子函数(按序号查找)
LNode *Get_LinkList(LinkList L,int i)
{
LNode *p;
int j; //j是计数器,用来判断当前的结点是否是第i个结点
p=L;
j=0;
while(p!=NULL&&j<i)
{
p=p->next ; //当前结点p不是第i个且p非空,则p移向下一个结点
j=j+1;
}
return p;
}

//插入运算子函数
void Insert_LinkList(LinkList L,int i,DataType x) //在单链表L中第i个位置插入值为x的新结点
{
LNode *p,*s;
p = Get_LinkList(L,i-1); //寻找链表的第i-1个位置结点
if(p==NULL)
{
printf("插入位置不合法!");
exit(1);
}
else
{
s= (LinkList)malloc(sizeof(LNode)); //为当前插入元素的指针分配地址空间
s->data =x;
s->next =p->next ;
p->next =s;
}
}

//单链表的删除运算子函数
void Delete_LinkList(LinkList L,int i) //删除单链表上的第i个结点
{
LNode *p,*q;
p=Get_LinkList(L,i-1); //寻找链表的第i-1个位置结点
if(p==NULL)
{
printf("删除的位置不合法!"); //第i个结点的前驱结点不存在,不能执行删除操作
exit(1);
}
else
{
if(p->next ==NULL)
{
printf("删除的位置不合法!"); //第i个结点不存在,不能执行删除操作
exit(1);
}

else
{
q=p->next ;
p->next =p->next->next;
free(q);
}
}
}

//求表长运算子函数
int Length_LinkList(LinkList L)
{
int l; //l记录L的表长
LNode *p;
p=L->next;
l=1;
while(p->next)
{
p=p->next;
l++;
}
return l;
}
用switch写main函数的调用。。
展开
 我来答
t君凡
推荐于2018-02-27 · 超过23用户采纳过TA的回答
知道答主
回答量:66
采纳率:0%
帮助的人:49.2万
展开全部

#include<stdio.h>
#include<windows.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

//定义数据类型名称
typedef int DataType;

#define flag -1        //定义数据输入结束的标志数据

//单链表结点存储结构定义
typedef struct Node
{
    DataType data;
    struct Node *next;
}LNode ,*LinkList;

//建立单链表子函数
 LNode *Create_LinkList()
{
    LNode *s,*head,*L;int i=0,x;        //定义指向当前插入元素的指针
    while(1)
    {
        scanf("%d",&x);
        if(-1==x)
        {   return head;
            break;}
        s= (LNode *)malloc(sizeof(LNode));        //为当前插入元素的指针分配地址空间
        s->data =x;
        s->next =NULL;
        i++;
        if(i==1)
            head=s;
        else
            L->next =s;
            L=s;

    }
}
//查找子函数(按序号查找)
LNode *Get_LinkList(LinkList L,int i)
{
    LNode *p;
    int j;        //j是计数器,用来判断当前的结点是否是第i个结点
    p=L;
    j=1;
    while(p!=NULL&&j<i)
    {
        p=p->next ;        //当前结点p不是第i个且p非空,则p移向下一个结点
        j++;
    }
    return p;
}

//插入运算子函数
void Insert_LinkList(LinkList L,int i,DataType x)        //在单链表L中第i个位置插入值为x的新结点
{
    LNode *p,*s;
    p =Get_LinkList(L,i);        //寻找链表的第i-1个位置结点
    if(p==NULL)
    {
        printf("插入位置不合法!");
        exit(-1);
    }
    else
    {
        s= (LinkList)malloc(sizeof(LNode));        //为当前插入元素的指针分配地址空间
        s->data =x;
        s->next =p->next ;
        p->next =s;
    }
}

//单链表的删除运算子函数
void Delete_LinkList(LinkList L,int i)        //删除单链表上的第i个结点
{
    LNode *p,*q;
    p=Get_LinkList(L,i-1);        //寻找链表的第i-1个位置结点
    if(p==NULL)
    {
        printf("删除的位置不合法!");        //第i个结点的前驱结点不存在,不能执行删除操作
        exit(-1);
    }
    else
    {
        if(p->next ==NULL)
        {
            printf("删除的位置不合法!");        //第i个结点不存在,不能执行删除操作
            exit(-1);
        }

        else
        {
            q=p->next ;
            p->next =p->next->next;
            free(q);
        }
    }
}

//求表长运算子函数
int Length_LinkList(LinkList L)
{
    int l;        //l记录L的表长
    LNode *p;
    p=L;
    l=1;
    while(p->next)
    {
        p=p->next;
        l++;
    }
    return l;
}
int main ()
{
    LNode *head,*p;
    head=(LinkList)malloc(sizeof(LNode));
    int x,y;
    a:
    printf("*******menu*******\n");
    printf("**创建**********1*\n");
    printf("**插入**********2*\n");
    printf("**删除**********3*\n");
    printf("**表长**********4*\n");
    printf("**清屏**********5*\n");
    printf("**打印**********6*\n");
    printf("**退出******other*\n");
    printf("******************\n");
    int i=1;
    while(i)
    {
        printf("请输入选项:");
        scanf("%d",&i);
        switch(i)
        {
            case 1:head=Create_LinkList(); getchar();break;
            case 2:printf("请输入位置和数据;");
            scanf("%d%d",&x,&y);
            Insert_LinkList(head,x,y);break;
            case 3:printf("请输入位置;");
                scanf("%d",&x);
                Delete_LinkList(head,x);break;
            case 4:printf("%d",Length_LinkList(head));break;
            case 5:system("cls");goto a;
            case 6:p=head;
        while(p!=NULL)
                {printf("%d\n",p->data);
                p=p->next;}
                break;
            default :i=0;
        }
    }
}

我把创建给改了一下

追问
主函数调用里还少了查询。。能加下我的Q么?谢谢
3
9
8
4
7
3
3
7
5
追答
查询是查第几位吗?那么添这几行,菜单自拟
不是,说的明白点吧
 case 7:
            printf("请输入要查找字:\n");
            scanf("%d",&x);
            p=head;
            y=1;
            while(p!=NULL)
            {
               if(p->data==x)
                printf("x是第%d位\n",y);
               y++;p=p->next;
            }
            break;
chinaboyzyq
2016-01-18 · TA获得超过1.3万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:3313万
展开全部

1、以下示例c语言调用函数建立和显示链表:

#include<stdio.h>
#define NULL 0
#define LEN sizeof(struct student)
void print();
struct student *creat();
struct student
{
long num;
float score;
struct student *next;
};
int n;

int main()
{
struct student *head,stu;
printf("input records:\n");
head=creat();
print(head);

}

struct student *creat()/*此函数带回一个指向链表头的指针*/
{
struct student *head;
struct student *p1,*p2;
n=0;
p1=p2=(struct student *)malloc(LEN);/*开辟一个新单元*/ 
scanf("%ld,%f",&p1->num,&p1->score);
head=NULL;
while(p1->num!=0)
{
n+=1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student *)malloc(LEN);
scanf("%ld,%f",&p1->num,&p1->score);

}
p2->next=NULL;
return(head);
 
}

void print(head)/*显示链表*/
struct student *head;
{
struct student *p;
printf("\nNow,These %d records are:\n",n);
p=head;
if(head!=NULL)
do
{
printf("%ld %5.1f\n",p->num,p->score,p->score);
p=p->next;
} while(p!=NULL);

}

2、测试环境c-free5的标准C。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式