链表的基本运算,插入,删除和输出
【问题描述】
设计并实现线性表的单链表存储和运算。
【基本要求】
实现单链表的插入、删除和遍历运算,每种操作用一个函数实现。 插入操作:将一个新元素插入表中指定序号的位置。 删除操作:将指定序号的元素从表中删除。 遍历操作:从表头按次序输出所有元素的值,若是空表,则输出信息“empty list!”。
【实现提示】
- 程序运行时,首先在 main 函数中创建空的、带头结点的单链表。然后多次调用实现插入操作的函数(每次都将元素在序号 1 位置上插入),将元素依次插入表中,最后调用实现遍历操作的函数输出所有元素。之后再多次调用实现删除操作的函数将表还原为空表(每次都删除第 1 个元素,每删除 一个元素后,将表中剩余元素都输出一次)。
- 单链表结点类型定义:
- typedef int ElemType; //为简化起见,元素类型定义为整型
- typedef struct Node{
ElemType data; struct Node *next;
}Node, *LinkList;
5.为了简化指针参数传递,使用 c++的引用参数,存储源程序时注意后缀名应为 cpp。 (其他实 验题目在此处的处理相同)
6.创建链表时,可以多次调用插入函数(插入函数的功能是在链表的第 i 个元素结点前插入一个 新结点),通过不断地在链表中增加结点来实现,也可以定义一个专门创建链表的函数,调用一次该函 数就完成链表中所有结点的创建(当然,此后需要在链表中插入一个新结点时调用前述的插入函数即 可)。
/****************
链表的基本运算***
插入删除和输出***
by凉柒_lq ***
****************/
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct LNode
{
Elemtype data;
struct LNode* next;
}LNode;
typedef LNode* Linklist;
typedef int Status;
#define overflow -2
#define true 1
#define false 0
#define ok 1
#define error 0
/*表头插入法*/
Status Createlist(Linklist &L, int n)
{
int i;
Linklist p;
Status ListTravel(Linklist &L);
L = (Linklist)malloc(sizeof(LNode));
if (!L)
exit(overflow);
L->next = NULL;
for (i = n; i>0; i--)
{
p = (Linklist)malloc(sizeof(LNode));
if (!p)
exit(overflow);
scanf("%d", &p->data);
p->next = L->next;
L->next = p;
}
printf("\n");
ListTravel(L);
return ok;
}
/*空表判断函数*/
/*链表存在且只有头结点*/
Status ListEmpty(Linklist &L)
{
if (L != NULL && L->next == NULL)
{
printf("empty list!\n");
return true;
}
else
return false;
}
/*头结点删除函数*/
Status Topdellist(Linklist &L)
{
Status Listlength(Linklist &L);
Status ListTravel(Linklist &L);
int j; Linklist p;
int b = Listlength(L);
for (j = 0; j<b; j++)
{
p = L;
p = p->next;
L->next = p->next;
free(p);
ListTravel(L);
}
if(ListEmpty(L))
return ok;
}
/*链表长度函数*/
Status Listlength(Linklist &L)
{
Linklist p;
int i;
if (L)
{
i = 0;
p = L->next;
while (p)
{
i++;
p = p->next;
}
}
return i;
}
/*遍历并输出,调用visit函数*/
Status ListTravel(Linklist &L)
{
void Visit(Linklist &p);
Linklist p;
if (!L)
return 0;
else
p = L->next;
while (p)
{
Visit(p);
p = p->next;
}
if(L->next!=NULL)
printf("\n\n");
return ok;
}
/*visit函数*/
void Visit(Linklist &p)
{
printf("%d ",p->data);
}
/*主函数*/
int main()
{
Linklist L;
Createlist(L, 5);
Topdellist(L);
return 0;
}
运行结果截图:
代码不难,细看就可以看懂,明天会更新第二种方法。
原创,转载注明出处。