1.从键盘输入若千大于0的整数,用这些整数构造一个单链表.当用户输入小于等于0的值时,创建链表结束并在终端打印输出这个链表。
2.在链表中查找某结点,如果能找到输出这个结点是第几个结点,如果找不到,输出:找不到此结点。
3.删除指定结点:如果指定的被删除结点存在就删除它,然后打印:已经删除,如果不存在,输出信息:链表中没有此结点,无法删除。
4.删除重复结点:如果链表中有重复的元素,删除重复的元素,使得所有值最多只出现一次,例如,如果链表中有3个结点的值是100,那么需要删除两个值为100的结点。只保留一个值为100的结点。删除重复结点后打印输出整个链表
功能全部完成,有帮助请采纳!
#include<stdio.h>
#include<stdlib.h>
typedef struct link_list
{
int num;
struct link_list* next;
} STU;
void creat(STU* head)//(创建链表)
{
int n=1;
STU* p = NULL, * q = head;
while (n >= 0)
{
scanf("%d", &n);
if(n<0)
{
break;
}
else
{
p = (STU*)malloc(sizeof(STU)+1);
p->next=NULL;
p->num = n;
q->next = p;
q = p;
}
}
q->next = NULL;
}
void print(STU* head)//(输出链表)
{
STU* p=head->next;
while (p)
{
printf("%d ", p->num);
p = p->next;
}
}
int search(STU* head, int n)
{
int j;
STU *p;
p=head->next;
j=1;
while (p!= NULL)
{
if (p->num == n)
{
printf("该结点位于第%d个\n",j);
return j;
}
p = p->next;
j++;
}
printf("找不到此结点。");
return -1;
}
void charu(STU* list, int n)
{
STU *t = list, *in;
int i = 0;
while (i < n && t != NULL)
{
t = t->next;
i++;
}
if (t != NULL)
{
in = (STU*)malloc(sizeof(STU));
puts("输入要插入的值");
scanf("%d", &in->num);
in->next = t->next;//填充in节点的指针域,也就是说把in的指针域指向t的下一个节点
t->next = in;//填充t节点的指针域,把t的指针域重新指向in
}
else
{
puts("找不到此结点");
}
}
void deleted(STU* head, int n)//删除链表(输入学号)
{
STU *t = head, *in;
int i = 0;
while (i < n && t != NULL)
{
in = t;
t = t->next;
i++;
}
if (t != NULL)
{
in->next = t->next;
free(t);
}
else
{
puts("链表中没有此结点,无法删除。");
}
/*STU* p = head->next;
while (p && p->num != n)
{
head = p, p = p->next;
}
if (p)
{
head->next = p->next;
free(p);
}
print(head);*/
}
int t=0;
void dere(STU* head)
{
STU *d=head->next,*p=head->next,*q;
while(d!=NULL)//删除操作
{
p=d;
q=p->next;//q指向待删除结点
while(q!=NULL)
{
if(d->num==q->num)
{
t++;//删除数的次数
p->next=q->next;//p指向q的下一个结点,删除结点q
q=q->next;
}
else
{
p=q;
q=q->next;
}
}
d=d->next;
}
}
int main()
{
STU* head = (STU*)malloc(sizeof(STU));
int c=250;
puts("请输入数值,-1结束:");
creat(head);
while(c--)
{
printf("\n输出链表请扣1\n链表删除重复数值请扣2\n链表查找请扣3\n链表删除请扣4\n输入-1结束\n");
int requst, n;
scanf("%d", &requst);
switch (requst)
{
case 1:
print(head);
break;
case 2:
dere(head);
puts("删除重复数值后:");
print(head);
break;
case 3:
puts("请输入要查找的值:");
scanf("%d", &n);
search(head, n);
break;
case 4:
puts("请输入要删除的值:");
scanf("%d", &n);
deleted(head, n);
printf("删除%d数值后:\n",n);
print(head);
break;
default :
break;
}
if(n==-1)
{
break;
}
}
}