求大佬帮我看下这个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);
}
int InitList(LinkList L)
{
L= (LinkList)malloc(sizeof(LNode)); //修改形参没有用处,离开这个函数形参就结束存在了
if (!L)
{
printf("分配内存失败!\n");
exit(0);
}
L->next = NULL;
return 0;
} #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);
}
供参考~ 删除和显示输出链表函数,增加对空链表的判断及反馈,供参考:
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]