设计一个测试应用程序完成如下功能:
(1)建立单链表L;依次插入数据元素13,5,27,9,32,123,76,98,54,87;直至数据元素为32767为止;
(2)查找单链表L的第3个数据元素;
(3) 查找数据元素76;
(4)在第4个位置上插入数据元素56;输出插入数据后的单链表;
(5)删除单链表l的第7个元素;输出删除数据后的单链表;
(6)删除单链表l中值为76的第一个元素;输出删除数据后的单链表;
(7)求单链表的长度并输出;
函数命名要求:
1)建立单链表createlinklist()
2)按序号查找getelem1(Lndoe *l,int I)值为76的元素
3)按元素值查找getelem2(Lndoe *l,int I)
4)插入数据元素linklistinsert(Lndoe *l,int I,int e)
在单链表l的第i个位置上插入新的元素e。
5)按序号删除linklistdelete1(Lndoe *l,int i)
删除单链表l的第i个元素。
6)按值删除linklistdelete2(Lndoe *l,int e)
7) 求单链表的长度(链表中元素的个数)linklistlength(Lnode *l)
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node* next;
} Lnode;
Lnode* createlinklist();
void printlist(Lnode* L);
int getelem1(Lnode* L, int i);
int getelem2(Lnode* L, int e);
Lnode* linklistinsert(Lnode* L, int i, int e);
Lnode* linklistdelete1(Lnode* L, int i);
Lnode* linklistdelete2(Lnode* L, int e);
int linklistlength(Lnode* L);
Lnode* L;
int main(void)
{
printf("请输入链表初始元素,以32767结束:\n");
L = createlinklist();
printf("\n(1)\n");
printf("链表成功建立为:\n");
printlist(L);
printf("\n(2)\n");
printf("链表的第三个数据元素为:%d\n", getelem1(L, 3));
printf("\n(3)\n");
printf("链表元素76的位置为:第%d个\n", getelem2(L, 76));
printf("\n(4)\n");
printf("在第4个位置上插入数据元素56:\n");
L = linklistinsert(L, 4, 56);
printlist(L);
printf("\n(5)\n");
printf("删除链表L的第7个元素:\n");
L = linklistdelete1(L, 7);
printlist(L);
printf("\n(6)\n");
printf("删除链表L的值为76的元素:\n");
L = linklistdelete2(L, 76);
printlist(L);
printf("\n(7)\n");
printf("链表的长度为:%d\n", linklistlength(L));
return 0;
}
Lnode* createlinklist()
{
Lnode* L = (Lnode*)malloc(sizeof(Lnode));
L->next = NULL;
Lnode* r = L;
int n;
while (1) {
scanf("%d", &n);
if (n == 32767)
break;
Lnode* p = (Lnode*)malloc(sizeof(Lnode));
p->data = n;
r->next = p;
r = p;
}
r->next = NULL;
return L;
}
void printlist(Lnode* L)
{
Lnode* q = L->next;
while (q != NULL) {
printf("%d ", q->data);
q = q->next;
}
printf("\n");
}
int getelem1(Lnode* L, int i)
{
Lnode* p = L->next;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (!p || j > i) {
printf("位置%d不存在\n", i);
return -1;
}
return p->data;
}
int getelem2(Lnode* L, int e)
{
Lnode* p = L->next;
int i = 1;
while (p && p->data != e) {
p = p->next;
i++;
}
if (p) {
return i;
}
printf("元素%d不存在\n", e);
return -1;
}
Lnode* linklistinsert(Lnode* L, int i, int e)
{
Lnode* p = L;
int j = 0;
while (p && j < i - 1) {
p = p->next;
j++;
}
if (!p || j > i - 1) {
printf("插入位置%d不存在\n", i);
return L;
}
Lnode* new_node = (Lnode*)malloc(sizeof(Lnode));
new_node->data = e;
new_node->next = p->next;
p->next = new_node;
return L;
}
Lnode* linklistdelete1(Lnode* L, int i)
{
Lnode* p = L;
int j = 0;
while (p->next && j < i - 1) {
p = p->next;
j++;
}
if (!p->next || j > i - 1) {
printf("删除位置%d不存在\n", i);
return L;
}
Lnode* temp = p->next;
p->next = temp->next;
free(temp);
return L;
}
Lnode* linklistdelete2(Lnode* L, int e)
{
Lnode* p = L;
while (p->next && p->next->data != e) {
p = p->next;
}
if (p->next) {
Lnode* temp = p->next;
p->next = temp->next;
free(temp);
} else {
printf("元素%d不存在\n", e);
}
return L;
}
int linklistlength(Lnode* L)
{
int length = 0;
Lnode* p = L->next;
while (p) {
length++;
p = p->next;
}
return length;
}
运行结果:
(个人答案,如有错误或改进建议欢迎联系作者)