题目:设有一个带头结点的单向链表,要求:在此链表中查找值为X的节点,若找到该节点则将其在链表中删除,若未找到则将其放到该链表的最后位置。
代码如下:
/*11.15建立在原有基础上把X视为int类型进行代码的编写*/
#include<stdio.h>
#include<stdlib.h>
typedef int elemtype;
typedef struct node {
elemtype data;
struct node* next;
}LinkList, LNode;
//头插法创建链表
LinkList* CreateList(int n)
{
int i;
LinkList* L, * p;
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;//L为头结点
for (i = n; i >= 1; i--)
{
p = (LNode*)malloc(sizeof(LNode));
printf("请输入第%d个元素:\n", i);
scanf_s("%d", &p->data);
p->next = L->next;
L->next = p;
}
return L;
}
//打印
LinkList* PrintList(LNode* L)
{
LinkList* s;
s = (LNode*)malloc(sizeof(LNode));
s = L->next;//指向首结点
printf("现输出单链表中的元素:\n");
while (s != NULL)//s为空则停止
{
printf("%d ", s->data);
s = s->next;
}
printf("\n");
return 0;
}
//按值查找
int LocateList(LNode L, elemtype e)
{
LinkList* s;
int i = 1;
s = (LNode*)malloc(sizeof(LNode));
s = L.next;
if (L.data == NULL)
{
printf("empty"); exit(0);
}
while (s != NULL && s->data != e)//此处把s!=NULL放前面 判断表满
{
s = s->next;
i++;
}
if (s == NULL)
{
printf("---------链表中不存在该值----------\n");
return 0;
}
else
return i;
}
//删除指定位置的链表元素(不返回删除部分)
int Delect(LNode* L, int i)
{
if (L->next == NULL) {
printf("empty");
exit(0);
}
int j=0;
LinkList* s;
s = (LNode*)malloc(sizeof(LNode));
s = L;//s指向头结点
while(s!= NULL &&j<i-1)
{
s = s->next;
j++;
}//将s定位到i-1的结点
if (s ->next==NULL)
{
printf("删除元素不存在\n");
return 0;
}
else
{
LinkList* q;
q = (LNode*)malloc(sizeof(LNode));
q = s->next;
s->next = q->next;
free(q);
return L;
}
}
//插入元素到指定的位置
int InsertList(LNode* L, int i, elemtype a)
{
LinkList* s;
s = (LNode*)malloc(sizeof(LNode));
s = L;
if (L->next == NULL)
{
printf("empty");
exit(0);
}
else
{
int j = 1;//若j为0 则j<i-1否则会多向后指 指到第i个元素 本算法要求指到i前一个元素进行插入
while (s->next != NULL && j < i)
{
s = s->next;
j++;
}
}
LinkList* p;
p = (LNode*)malloc(sizeof(LNode));
p->data = a;
p->next = s->next;//先连再断
s->next = p;
return 0;
//free(p);犯了思想固化的错误 如果在这里把p释放掉了以后 链表就找不到了
}
int main()
{
int num,flag;
LinkList* first;
elemtype* e, b, * d;
e = (elemtype*)malloc(sizeof(elemtype));
d = (elemtype*)malloc(sizeof(elemtype));
/*LinkList*first2;*/
printf("请输入单链表存储的个数:\n");
scanf_s("%d", &num);
first = CreateList(num);
PrintList(first);
printf("请输入要查找的内容:\n");
scanf_s("%d", &b);
flag = LocateList(*first, b);
if (flag)
printf("%d的位置是%d\n", b, flag);
if (flag)
{
Delect(first, flag);
PrintList(first);
}
else
{
InsertList(first, num+1, b);
PrintList(first);
}
return 0;
}
运行结果如下:
1.查找的元素不存在,则插入到链表最后位置:
2.查找元素存在,则删除该元素: