微恋晨曦 发表于 2021-5-15 09:31:01

求大佬帮我看下这个c语言链表哪出问题了

#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct LNode                              //定义一个结构体
{
    Elemtype data;                                 //结点的数据域
    struct LNode *next;                              //节点的指针域
}LNode , *LinkList;                                  //指针类型

int InitList(LinkList L)                            //带有头节点的单链表的初始化
{
    L= (LinkList)malloc(sizeof(LNode));            
    if (!L)                                          //储存分配失败退出
    {
      printf("分配内存失败!\n");
      exit(0);
    }
    L->next = NULL;                                 //空表长度为null                  
    return 0;
}

int LengthList(LinkList L)                  //计算链表长度
{
    int length = 0;
    LinkList p;
    p = L->next;
    while (p)
    {
      length++;
      p = p->next;
    }
    return length;
}

int GetElem(LinkList L, int i, Elemtype e)            //用e返回L中第i个元素值
{
    LinkList p;                                     //初始化,p指向首元结点,计数器j=1
    int j = 1;
    p = L->next;                                    //顺序链表向后扫描,直到p为空或者p指向第i个元素
    while (p && j < i)
    {
      p = p->next;                              //p指向下一个元素
      ++j;
    }
    if (!p || j > i)                              //i不合法
    {
      printf("查询不到该元素!\n");
      return 0;
    }
    e = p->data;                                 
    return 0;
}


void CreateList_F(LinkList L,int n)            //头插法创建一个单链表,n为要插入的元素个数
{
    int i;
    LinkList p;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    printf("请输入您要插入元素的个数:");
    scanf("%d", &n);
    printf("请输入你要插入的元素值(用空格隔开):");
    for (i = n; i >0;--i)
    {
      p = (LNode*)malloc(sizeof(LNode));
      scanf_s("%d", &p->data);
      p->next = L->next;
      L->next = p;
    }
   
}

int InsertList_L(LinkList L, int i, Elemtype e)            //在L中第i个位置插入元素e
{
    LinkList p, s;
    int j = 0;
    p = L;
    while (p && j < i)                                  //寻找第i-1结点
    {                                                      
      p = p->next;
      ++j;
    }
    if (!p || j > i) exit(1);                         //i大于表长+1或者小于1
    s = (LinkList)malloc(sizeof(LNode));               //生成新结点s
    s->data = e;                                    //将结点的数据域置为e
    s->next = p->next;                                 //将结点s插入L中
    p->next = s;
    return 0;
}

int DeleteList_L(LinkList L, int i)                //删除L中第i个元素,并用e返回其值
{
    LinkList p, q;
    int j = 0;
    p = L;
    printf("请输入要删除的结点位置:");
   
    while (p->next && j < i-1)                  //寻找第i个结点,并令p指向其前驱
    {
      p = p->next;
      ++j;
    }
    if (!(p->next) || j > i) exit(1);            //删除位置不合理
    q = p->next;                                 //临时保存被删除结点的地址以备释放
    p->next = q->next;                           //改变删除结点的前驱结点指针域
    free(q); //释放
   return 0;
}

void ShowList(LinkList L)                  //打印整个链表
{
    LinkList p;
    p = L->next;
    if (p == NULL)
    {
      printf("这是一个空链表!\n");
    }
    printf("单链表");
    while (p)
    {
      printf(" -> %d", p->data);
      p = p->next;
    }
    printf("\n");
}

main()
{
LinkList L;
int n;
int i,k;
printf("单链表的操作:\n");
printf("\t1.头插法建立单链表\n");
printf("\t2.输出单链表\n");   
printf("\t3.删除结点\n");
printf("\t4.退出\n");
do
{

      printf("选择所需功能: ");
      scanf("%d",&k);
      switch(k)
      {
          case 1:CreateList_F( L, n);
                  break;
         case 2:printf("单链表为:\n");
               ShowList(L);
                  break;
   
          case 3:
                  DeleteList_L( L, i);
                  break;
         
          case 4:printf("退出");
            exit(0);
            default:printf("输入错误\n");
            exit(0);
      }
    }while(1);
}

星烨 发表于 2021-5-18 16:18:28

int InitList(LinkList L)                           
{
    L= (LinkList)malloc(sizeof(LNode));             //修改形参没有用处,离开这个函数形参就结束存在了
    if (!L)                                       
    {
      printf("分配内存失败!\n");
      exit(0);
    }
    L->next = NULL;                                 
    return 0;
}

王增海 发表于 2021-5-24 10:19:08

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

typedef int Elemtype;
typedef struct LNode                              //定义一个结构体
{
    Elemtype data;                                 //结点的数据域
    struct LNode *next;                              //节点的指针域
}LNode , *LinkList;                                  //指针类型

int InitList(LinkList L)                            //带有头节点的单链表的初始化
{
    L= (LinkList)malloc(sizeof(LNode));
    if (!L)                                          //储存分配失败退出
    {
      printf("分配内存失败!\n");
      exit(0);
    }
    L->next = NULL;                                 //空表长度为null
    return 0;
}

int LengthList(LinkList L)                  //计算链表长度
{
    int length = 0;
    LinkList p;
    p = L->next;
    while (p)
    {
      length++;
      p = p->next;
    }
    return length;
}

int GetElem(LinkList L, int i, Elemtype e)            //用e返回L中第i个元素值
{
    LinkList p;                                     //初始化,p指向首元结点,计数器j=1
    int j = 1;
    p = L->next;                                    //顺序链表向后扫描,直到p为空或者p指向第i个元素
    while (p && j < i)
    {
      p = p->next;                              //p指向下一个元素
      ++j;
    }
    if (!p || j > i)                              //i不合法
    {
      printf("查询不到该元素!\n");
      return 0;
    }
    e = p->data;
    return 0;
}


void CreateList_F(LinkList *L,int n)            //头插法创建一个单链表,n为要插入的元素个数
{
    int i;
    LinkList p;
    (*L) = (LinkList)malloc(sizeof(LNode));
    (*L)->next = NULL;
    printf("请输入您要插入元素的个数:");
    scanf("%d", &n);
    printf("请输入你要插入的元素值(用空格隔开):");
    for (i = n; i >0;--i)
    {
      p = (LNode*)malloc(sizeof(LNode));
      //scanf_s("%d", &p->data);
      scanf("%d", &p->data);
      p->next = (*L)->next;
      (*L)->next = p;
    }

}

int InsertList_L(LinkList L, int i, Elemtype e)            //在L中第i个位置插入元素e
{
    LinkList p, s;
    int j = 0;
    p = L;
    while (p && j < i)                                  //寻找第i-1结点
    {
      p = p->next;
      ++j;
    }
    if (!p || j > i) exit(1);                         //i大于表长+1或者小于1
    s = (LinkList)malloc(sizeof(LNode));               //生成新结点s
    s->data = e;                                    //将结点的数据域置为e
    s->next = p->next;                                 //将结点s插入L中
    p->next = s;
    return 0;
}

int DeleteList_L(LinkList L, int i)                //删除L中第i个元素,并用e返回其值
{
    LinkList p, q;
    int j = 0;
    p = L;
    //printf("请输入要删除的结点位置:");

    while (p->next && j < i-1)                  //寻找第i个结点,并令p指向其前驱
    {
      p = p->next;
      ++j;
    }
    if (!(p->next) || j > i) exit(1);            //删除位置不合理
    q = p->next;                                 //临时保存被删除结点的地址以备释放
    p->next = q->next;                           //改变删除结点的前驱结点指针域
    free(q); //释放
    return 0;
}

void ShowList(LinkList L)                  //打印整个链表
{
    LinkList p;
    p = L->next;
    if (p == NULL)
    {
      printf("这是一个空链表!\n");
    }
    printf("单链表");
    while (p)
    {
      printf(" -> %d", p->data);
      p = p->next;
    }
    printf("\n");
}

//main()
int main()
{
    LinkList L;
    int n;
    int i,k;
    printf("单链表的操作:\n");
    printf("\t1.头插法建立单链表\n");
    printf("\t2.输出单链表\n");
    printf("\t3.删除结点\n");
    printf("\t4.退出\n");
    do
    {

      printf("选择所需功能: ");
      scanf("%d",&k);
      switch(k)
      {
            case 1:CreateList_F(&L, n);
                   break;
            case 2:printf("单链表为:\n");
                   ShowList(L);
                   break;

            case 3:
                   printf("请输入要删除的结点位置: ");
                   scanf("%d", &i);
                   DeleteList_L( L, i);
                   break;

            case 4:printf("退出");
                   exit(0);
            default:printf("输入错误\n");
                  exit(0);
      }
    }while(1);
}
供参考~

小会 发表于 2021-5-30 20:02:06

删除和显示输出链表函数,增加对空链表的判断及反馈,供参考:
int DeleteList_L(LinkList L, int i)                //删除L中第i个元素,并用e返回其值
{
    LinkList p, q;
    int j = 0;
    p = L;
    if(L == NULL){
       printf("这是一个空链表!\n");
       return -1;
    }
    //printf("请输入要删除的结点位置:");

    while (p->next && j < i-1)                  //寻找第i个结点,并令p指向其前驱
    {
      p = p->next;
      ++j;
    }
    if (!(p->next) || j > i) exit(1);            //删除位置不合理
    q = p->next;                                 //临时保存被删除结点的地址以备释放
    p->next = q->next;                           //改变删除结点的前驱结点指针域
    free(q); //释放
    return 0;
}

void ShowList(LinkList L)                  //打印整个链表
{
    LinkList p;
    if (L == NULL)
    {
      printf("这是一个空链表!\n");
      return;
    }
    printf("单链表");
    p = L->next;
    while (p)
    {
      printf(" -> %d", p->data);
      p = p->next;
    }
    printf("\n");
}
页: [1]
查看完整版本: 求大佬帮我看下这个c语言链表哪出问题了