不懂就问

给我高高飞起来 2021-03-31 08:35:37
请问为什么我这个代码一直编译不出来,说是存在死循环,代码目的是 链表的实现之增删功能代码太大,评论接.
#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"
//#include "LinkList.cpp"

int main()
{
LinkList L;
int n,i,x;

scanf("%d", &n); //输入元素的个数
LL_Create_R(L, n); //建立一个链表

scanf("%d%d", &i,&x);//输入待插入的位置和待插入元素的值
LL_InsAt(L, i, x);

scanf("%d", &i); //输入待删除元素的位置
LL_DelAt(L, i);

scanf("%d", &x); //输入待删除元素的值
LL_DelValue(L, x);

LL_Print(L);
LL_Free(L);
}
...全文
305 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qzjhjxj 2021-03-31
  • 打赏
  • 举报
回复
供参考:
#include <stdio.h>
#include <stdlib.h>
//#include "LinkList.h"
//#include "LinkList.cpp"


/*************************************************************
    链表的实现  头文件
**************************************************************/

typedef int ElemType;

typedef struct LNode{
               ElemType   data;       //数据域
               struct LNode  *next;   //指针域
}LNode,*LinkList;     // LinkList为指向结构体LNode的指针类型

//单链表的初始化,即:构造一个带头结点的空的单链表
void LL_Initiate(LinkList &L);

// 释放链表中各个结点
void LL_Free(LinkList &L);

// 判断链表是否为空。
bool LL_IsEmpty(LinkList L);

// 输入n个数据元素,采用头插法,创建一个带头结点的单链表L。
void LL_Create_H(LinkList &L,int n);

// 输入n个数据元素,采用尾插法,创建一个带头结点的单链表L。
void LL_Create_R(LinkList &L,int n);

// 输出整个链表。
void LL_Print(LinkList L);

// 在带头结点的单链表L中获取第i个元素的值赋给e,i的取值范围[1,n]
void LL_GetAt(LinkList L, int i, ElemType &e);

//在带头结点的单链表L中查找第一个值为e的元素,
//找到则将该元素在链表中的位置赋给i,并返回该结点指针,否则i赋值为0并返回空指针
LNode *LL_FindValue(LinkList L, ElemType e,int &i);

// 在带头结点的单链表L中第i个位置插入值为e的新元素,i的取值范围[1,n+1]
void LL_InsAt(LinkList L,int i,ElemType e);

// 在带头结点的单链表L中,删除第i个元素,i的取值范围[1,n]
void LL_DelAt(LinkList L,int i);

// 删除第一个值为e的数据元素
void LL_DelValue(LinkList L, ElemType e);



int main()
{
    LinkList L;
    int n,i,x;

    LL_Initiate(L);//构造一个带头结点的空的单链表

    scanf("%d",&n); //输入元素的个数
    LL_Create_R(L, n); //建立一个链表
    LL_Print(L);

    scanf("%d%d",&i,&x);//输入待插入的位置和待插入元素的值
    LL_InsAt(L, i, x);
    LL_Print(L);
    
    scanf("%d",&i); //输入待删除元素的位置
    LL_DelAt(L, i);
    LL_Print(L);

    scanf("%d", &x); //输入待删除元素的值
    LL_DelValue(L, x);
    LL_Print(L);
    
    LL_Free(L);
    return 0;
}



/*************************************************************
    链表的实现之增删功能  实现文件
    更新于2020年4月21日
**************************************************************/

//#include <stdio.h>
//#include <stdlib.h>
//#include "LinkList.h"


void LL_Initiate(LinkList &L)
//单链表的初始化,即:构造一个带头结点的空的单链表
{
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
} 

void LL_Free(LinkList &L)
// 释放链表中各个结点。
{
    LinkList p=L->next,q;
    while(1){
          if (p==NULL)break;
          q=p->next;
          free(p);
          p=q;
    }     
}

bool LL_IsEmpty(LinkList L)
// 判断链表是否为空。
{
    return L->next==NULL;
}

void LL_Create_H(LinkList &L,int n)
// 输入n个数据元素,采用头插法,创建一个带头结点的单链表L。
{
    LinkList s,r;
    int i;
    //L=(LinkList)malloc(sizeof(LNode));
    //L->next=NULL; //建立一个带头结点的空链表
    r=L;
    for(i=0;i<n;i++)
     {
        s=(LinkList)malloc(sizeof(LNode)); //生成新结点
        scanf("%d",&s->data); //输入元素值
        s->next=r->next;
        r->next=s;  //插入到表头
     }
}

void LL_Create_R(LinkList &L,int n)
// 输入n个数据元素,采用尾插法,创建一个带头结点的单链表L。
{    
     LinkList r,s;
     int i;
     //L=(LinkList)malloc(sizeof(LNode));
     //L->next=NULL; //建立一个带头结点的空链表
     r=L;  //尾指针r指向头结点
     for(i=0;i<n;i++)
      {
          s=(LinkList)malloc(sizeof(LNode)); //生成新结点
          scanf("%d", &s->data); //输入元素值
          s->next=NULL;
          r->next=s; //插入到表尾
          r=s;  //r指向新的尾结点
      }
}

void LL_Print(LinkList L)
// 输出整个线性表。
{
     LinkList p;
     p=L->next;
     while(p){
           printf("%d  ",p->data);
           p=p->next;
     }
     printf("\n");
}

void LL_InsAt(LinkList L,int i,ElemType e)
// 在带头结点的单链表L中第i个位置插入值为e的新元素,i的取值范围[1,n+1]
{
// 请在这里补充代码,完成本关任务
    /********** Begin *********/
     LinkList s=L,p;
     int k=0;
     while(1){      //while(k!=(i-1))
           if (s == NULL)break;
           k++;
           if (k==i){
               p=(LinkList)malloc(sizeof(LNode));
               p->data = e;
               p->next = s->next;
               s->next = p;
               break;
           }
           s=s->next;
     }
    /********** End **********/
}

void LL_DelAt(LinkList L,int i)
// 在带头结点的单链表L中,删除第i个元素,i的取值范围[1,n]
{
   // 请在这里补充代码,完成本关任务
    /********** Begin *********/
     LinkList s=L,p;
     int k=0;
     while(1){ //while(k!=(i-1))
           if (s==NULL)break;
           k++;
           if (k==i){
               p=s->next;
               if (p){
                   s->next=p->next;
                   free (p);
               }
               break;
           }
           s=s->next;
     }
   /********** End **********/
}

void LL_DelValue(LinkList L, ElemType e)
// 删除第一个值为e的数据元素
{
// 请在这里补充代码,完成本关任务
    /********** Begin *********/
    int n;
    LinkList p=L,s=NULL,q;
    while(1){ //while(n!=e)
         if (p==NULL)break;
         if (p->data == e){
             q=p;
             if (q){
                 s->next=q->next;
                 free(q);
             }
             break;
         }
         s=p;
         p=p->next;
    }
   /********** End **********/
}
自信男孩 2021-03-31
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LNode{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList; // LinkList为指向结构体LNode的指针类型

//单链表的初始化,即:构造一个带头结点的空的单链表
void LL_Initiate(LinkList &L);

// 释放链表中各个结点
void LL_Free(LinkList &L);

// 判断链表是否为空。
bool LL_IsEmpty(LinkList L);

// 输入n个数据元素,采用头插法,创建一个带头结点的单链表L。
void LL_Create_H(LinkList &L,int n);

// 输入n个数据元素,采用尾插法,创建一个带头结点的单链表L。
void LL_Create_R(LinkList &L,int n);

// 输出整个链表。
void LL_Print(LinkList L);

// 在带头结点的单链表L中获取第i个元素的值赋给e,i的取值范围[1,n]
void LL_GetAt(LinkList L, int i, ElemType &e);

//在带头结点的单链表L中查找第一个值为e的元素,
//找到则将该元素在链表中的位置赋给i,并返回该结点指针,否则i赋值为0并返回空指针
LNode *LL_FindValue(LinkList L, ElemType e,int &i);

// 在带头结点的单链表L中第i个位置插入值为e的新元素,i的取值范围[1,n+1]
void LL_InsAt(LinkList L,int i,ElemType e);

// 在带头结点的单链表L中,删除第i个元素,i的取值范围[1,n]
void LL_DelAt(LinkList L,int i);

// 删除第一个值为e的数据元素
void LL_DelValue(LinkList L, ElemType e);

int main()
{
LinkList L;
int n,i,x;

scanf("%d", &n); //输入元素的个数
LL_Create_R(L, n); //建立一个链表

printf("After Create: \n");
LL_Print(L);
scanf("%d%d", &i,&x);//输入待插入的位置和待插入元素的值
LL_InsAt(L, i, x);
printf("After Insert: \n");
LL_Print(L);

scanf("%d", &i); //输入待删除元素的位置
LL_DelAt(L, i);
printf("After DelAt: \n");
LL_Print(L);

scanf("%d", &x); //输入待删除元素的值
LL_DelValue(L, x);
printf("After DelValue: \n");
//LL_Print(L);

LL_Print(L);
LL_Free(L);
}

void LL_Initiate(LinkList &L)
//单链表的初始化,即:构造一个带头结点的空的单链表
{
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
}

void LL_Free(LinkList &L)
// 释放链表中各个结点。
{
LinkList p;
while(L)
{
p=L;
L=L->next;
free(p);
}
}

bool LL_IsEmpty(LinkList L)
// 判断链表是否为空。
{
return L->next==NULL;
}

void LL_Create_H(LinkList &L,int n)
// 输入n个数据元素,采用头插法,创建一个带头结点的单链表L。
{
LNode *s; int i;
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL; //建立一个带头结点的空链表
for(i=0;i<n;i++)
{
s=(LNode *)malloc(sizeof(LNode)); //生成新结点
scanf("%d", &s->data); //输入元素值
s->next=L->next; L->next=s; //插入到表头
}
}

void LL_Create_R(LinkList &L,int n)
// 输入n个数据元素,采用尾插法,创建一个带头结点的单链表L。
{
LNode *r,*s; int i;
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL; //建立一个带头结点的空链表
r=L; //尾指针r指向头结点
for(i=0;i<n;i++)
{
s=(LNode *)malloc(sizeof(LNode)); //生成新结点
scanf("%d", &s->data); //输入元素值
s->next=NULL;
r->next=s; //插入到表尾
r=s; //r指向新的尾结点
}
}

void LL_Print(LinkList L)
// 输出整个线性表。
{
LNode *p;
p=L->next;
while(p)
{
printf("%d ",p->data); p=p->next;
}
printf("\n");
}

void LL_InsAt(LinkList L,int i,ElemType e)
// 在带头结点的单链表L中第i个位置插入值为e的新元素,i的取值范围[1,n+1]
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
LNode *s=L,*p;
int k=1;

while(k!=(i-1))
{
k++;
s=s->next;

}
if (!s) {
fprintf(stderr, "Can't find the position!\n");
return;
}
//malloc memery
p = (LinkList) malloc(sizeof(LNode));
if (!p)
return;

p->data = e;
p->next = s->next;
s->next = p;

/********** End **********/
}

void LL_DelAt(LinkList L,int i)
// 在带头结点的单链表L中,删除第i个元素,i的取值范围[1,n]
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
LNode *s=L,*p;
int k=1;
while(k!=(i-1))
{
k++;
s=s->next;
//s->next=p;
}
if (!s || s->next == NULL) {
fprintf(stderr, "Can't find the position!\n");
return;
}
p = s->next;
s->next = p->next;

free(p);

/********** End **********/
}

void LL_DelValue(LinkList L, ElemType e)
// 删除第一个值为e的数据元素
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
int n;
LNode *p=L,*s,*q;

s = L->next;
while(p) {

if (s->data == e) {
break;
}
//q=p;
p=p->next;
//n=p->data;
s=p->next;

}
p->next = s->next;
free(s);
//q->next=s;

/********** End **********/
}

供参考~
赵4老师 2021-03-31
  • 打赏
  • 举报
回复
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
Simple-Soft 2021-03-31
  • 打赏
  • 举报
回复
参考这个链表的文章 我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《C语言结构体与链表,单向链表构造,链表遍历,链表元素查找,链表元素删除》, 一起来围观吧 https://blog.csdn.net/zhanghaiyang9999/article/details/114360628?utm_source=app&app_version=4.5.2
  • 打赏
  • 举报
回复
/************************************************************* 链表的实现之增删功能 实现文件 更新于2020年4月21日 **************************************************************/ #include <stdio.h> #include <stdlib.h> #include "LinkList.h" void LL_Initiate(LinkList &L) //单链表的初始化,即:构造一个带头结点的空的单链表 { L=(LNode *)malloc(sizeof(LNode)); L->next=NULL; } void LL_Free(LinkList &L) // 释放链表中各个结点。 { LinkList p; while(L) { p=L; L=L->next; free(p); } } bool LL_IsEmpty(LinkList L) // 判断链表是否为空。 { return L->next==NULL; } void LL_Create_H(LinkList &L,int n) // 输入n个数据元素,采用头插法,创建一个带头结点的单链表L。 { LNode *s; int i; L=(LNode *)malloc(sizeof(LNode)); L->next=NULL; //建立一个带头结点的空链表 for(i=0;i<n;i++) { s=(LNode *)malloc(sizeof(LNode)); //生成新结点 scanf("%d", &s->data); //输入元素值 s->next=L->next; L->next=s; //插入到表头 } } void LL_Create_R(LinkList &L,int n) // 输入n个数据元素,采用尾插法,创建一个带头结点的单链表L。 { LNode *r,*s; int i; L=(LNode *)malloc(sizeof(LNode)); L->next=NULL; //建立一个带头结点的空链表 r=L; //尾指针r指向头结点 for(i=0;i<n;i++) { s=(LNode *)malloc(sizeof(LNode)); //生成新结点 scanf("%d", &s->data); //输入元素值 s->next=NULL; r->next=s; //插入到表尾 r=s; //r指向新的尾结点 } } void LL_Print(LinkList L) // 输出整个线性表。 { LNode *p; p=L->next; while(p) { printf("%d ",p->data); p=p->next; } printf("\n"); } void LL_InsAt(LinkList L,int i,ElemType e) // 在带头结点的单链表L中第i个位置插入值为e的新元素,i的取值范围[1,n+1] { // 请在这里补充代码,完成本关任务 /********** Begin *********/ LNode *s=L,*p; int k=1; while(k!=(i-1)) { k++; s=s->next; } p->data=e; p->next=s->next; s->next=p; /********** End **********/ } void LL_DelAt(LinkList L,int i) // 在带头结点的单链表L中,删除第i个元素,i的取值范围[1,n] { // 请在这里补充代码,完成本关任务 /********** Begin *********/ LNode *s=L,*p; int k=1; while(k!=(i-1)) { k++; s=s->next; s->next=p; } s->next=p->next; /********** End **********/ } void LL_DelValue(LinkList L, ElemType e) // 删除第一个值为e的数据元素 { // 请在这里补充代码,完成本关任务 /********** Begin *********/ int n; LNode *p=L,*s,*q; while(n!=e) { q=p; p=p->next; n=p->data; s=p->next; } q->next=s; /********** End **********/ }
  • 打赏
  • 举报
回复
/************************************************************* 链表的实现 头文件 **************************************************************/ typedef int ElemType; typedef struct LNode{ ElemType data; //数据域 struct LNode *next; //指针域 }LNode,*LinkList; // LinkList为指向结构体LNode的指针类型 //单链表的初始化,即:构造一个带头结点的空的单链表 void LL_Initiate(LinkList &L); // 释放链表中各个结点 void LL_Free(LinkList &L); // 判断链表是否为空。 bool LL_IsEmpty(LinkList L); // 输入n个数据元素,采用头插法,创建一个带头结点的单链表L。 void LL_Create_H(LinkList &L,int n); // 输入n个数据元素,采用尾插法,创建一个带头结点的单链表L。 void LL_Create_R(LinkList &L,int n); // 输出整个链表。 void LL_Print(LinkList L); // 在带头结点的单链表L中获取第i个元素的值赋给e,i的取值范围[1,n] void LL_GetAt(LinkList L, int i, ElemType &e); //在带头结点的单链表L中查找第一个值为e的元素, //找到则将该元素在链表中的位置赋给i,并返回该结点指针,否则i赋值为0并返回空指针 LNode *LL_FindValue(LinkList L, ElemType e,int &i); // 在带头结点的单链表L中第i个位置插入值为e的新元素,i的取值范围[1,n+1] void LL_InsAt(LinkList L,int i,ElemType e); // 在带头结点的单链表L中,删除第i个元素,i的取值范围[1,n] void LL_DelAt(LinkList L,int i); // 删除第一个值为e的数据元素 void LL_DelValue(LinkList L, ElemType e);

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧