#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int ElementType;
typedef struct node
{
ElementType data;
struct node *next;
}LNode,*LinkList;
/*
头插法对单链表的创建
*/
LinkList Create_LinkList1(){
LNode *s;
int x;
LinkList H=(LinkList)malloc(sizeof(LNode));
H->next=NULL;
printf("请输入一个整数:");
scanf("%d",&x);
while(x!=-1)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
s->next=H->next;
H->next=s;
printf("\n请输入一个整数:");
scanf("%d",&x);
}
return H;
}
/*尾插法对链表的创建*/
LinkList creat_LinkList2(){
LNode *s, *r;
int x;
LinkList H=(LinkList)malloc(sizeof(LNode));
r = H;
H->next=NULL;//空表
printf("请输入一个整数:");
scanf("%d",&x);
while(x!=-1)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
s->next=r->next;
r->next=s;
r=s;
printf("\n请输入一个整数:");
scanf("%d",&x);
}
return H;
}
/*求得单链表的长度*/
int Length_LinkList(LinkList H){
int j = 0;
LNode *p=H;
while(p->next!=NULL)
{
p=p->next;
j++;
}
return j;
}
/*通过某个序号对值进行查找*/
LinkList Get_Linklist(LinkList H,int k){
LNode *p=H;
int j=0;
while(p->next!=NULL&&j<k)
{
p=p->next;
j++;
}
if(j==k) return p;
else return NULL;
}
/*通过值来进行查找*/
LNode *Locate_LinkList(LinkList H, ElementType x){
LNode *p=H->next;
while(p!=NULL&&p->data!=x)
{
p=p->next;
}
return p;
}
/*在单链表的某个索引位置插入某个值*/
int Insert_LinkList(LinkList H,int i,ElementType x){
LNode *p,*s;
p= Get_Linklist(H,i-1);
if(p==NULL)
{
printf("插入 %d 错误",i);
return -1;
}
else
{
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
s->next=p->next;
p->next=s;
return 1;
}
}
/*
按序号进行数据的删除
*/
int Del_LinkList(LinkList H,int i){
LinkList p,q;
p= Get_Linklist(H,i-1);
if(p==NULL)
{
printf("第i-1个节点不存在");
return -1;
}
else
{
if(p->next==NULL)
{
printf("第i个节点不存在");
return -1;
}
else
{
q=p->next;
p->next=q->next;
free(q);
return 1;
}
}
}
/**
对链表进行倒置
**/
void Reverse(LinkList H){
LNode *p,*q;
p=H->next;//p指向第一个数据节点
H->next=NULL;//将原链表值为空
while(p)
{
q=p;
p=p->next;
q->next=H->next;
H->next=q;
}
}
/*对链表中的值进行打印*/
void print_LinkList(LinkList H) {
LNode *p = H->next;
printf("单链表打印出的结果是:");
while (p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
/*单链表中删除重复节点*/
void pur_LinkList(LinkList H) {
LNode *p, *q, *r;
p = H->next; //p指向第一个节点
if (p != NULL) {
while (p->next)
{
q = p;
while (q->next)
{
if (q->next->data == p->data) {
r = q->next;
q->next = r->next;
free(r);
}
else
{
q = q->next;
}
}
p = p->next;
}
}
}
void print(){
LinkList H=NULL;
int i,k,x;
while (1)
{
printf(" 1-使用头插法进行链表的创建\n");
printf(" 2-使用尾插法实现链表的创建\n");
printf(" 3-查看链表的长度\n");
printf(" 4-按序号进行 查找\n");
printf(" 5-按值x进行查找\n");
printf(" 6-进行数据的插入\n");
printf(" 7-进行数据的删除\n");
printf(" 8-对数据进行倒置\n");
printf(" 9-对数据进行打印\n");
printf(" 10-删除单链表中重复的节点\n");
printf("\n请输入你要进行操作的序号:");
scanf("%d", &i);
switch (i)
{
case 1:H = Create_LinkList1();
break;
case 2:H = creat_LinkList2();
break;
case 3:printf("链表的长度为:%d\n",Length_LinkList(H)); break;
case 4:
printf("请输入你要查找的序号:");
scanf("%d", &k);
printf("%d \n", Get_Linklist(H, k)->data); break;
case 5:printf("请输入你要查找的值:");
scanf("%d", &x);
printf("查找的值为:%d\n", Locate_LinkList(H, x)->data); break;
case 6:printf("请输入你要在第几个位置插入的数:");
scanf("%d %d", &k, &x);
Insert_LinkList(H, k, x);
printf("插入成功! \n");
break;
case 7:
printf("请输入您要删除的序号:");
scanf("%d", &k);
Del_LinkList(H, k);
printf("删除成功!\n");
break;
case 8:Reverse(H);
printf("数据倒置成功,请查看!\n");
break;
case 9: print_LinkList(H); break;
case 10: pur_LinkList(H); break;
case 0: exit(0);
}
}
}
int main(void) {
print();
}
#include<malloc.h>
#include<stdlib.h>
typedef int ElementType;
typedef struct node
{
ElementType data;
struct node *next;
}LNode,*LinkList;
/*
头插法对单链表的创建
*/
LinkList Create_LinkList1(){
LNode *s;
int x;
LinkList H=(LinkList)malloc(sizeof(LNode));
H->next=NULL;
printf("请输入一个整数:");
scanf("%d",&x);
while(x!=-1)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
s->next=H->next;
H->next=s;
printf("\n请输入一个整数:");
scanf("%d",&x);
}
return H;
}
/*尾插法对链表的创建*/
LinkList creat_LinkList2(){
LNode *s, *r;
int x;
LinkList H=(LinkList)malloc(sizeof(LNode));
r = H;
H->next=NULL;//空表
printf("请输入一个整数:");
scanf("%d",&x);
while(x!=-1)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
s->next=r->next;
r->next=s;
r=s;
printf("\n请输入一个整数:");
scanf("%d",&x);
}
return H;
}
/*求得单链表的长度*/
int Length_LinkList(LinkList H){
int j = 0;
LNode *p=H;
while(p->next!=NULL)
{
p=p->next;
j++;
}
return j;
}
/*通过某个序号对值进行查找*/
LinkList Get_Linklist(LinkList H,int k){
LNode *p=H;
int j=0;
while(p->next!=NULL&&j<k)
{
p=p->next;
j++;
}
if(j==k) return p;
else return NULL;
}
/*通过值来进行查找*/
LNode *Locate_LinkList(LinkList H, ElementType x){
LNode *p=H->next;
while(p!=NULL&&p->data!=x)
{
p=p->next;
}
return p;
}
/*在单链表的某个索引位置插入某个值*/
int Insert_LinkList(LinkList H,int i,ElementType x){
LNode *p,*s;
p= Get_Linklist(H,i-1);
if(p==NULL)
{
printf("插入 %d 错误",i);
return -1;
}
else
{
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
s->next=p->next;
p->next=s;
return 1;
}
}
/*
按序号进行数据的删除
*/
int Del_LinkList(LinkList H,int i){
LinkList p,q;
p= Get_Linklist(H,i-1);
if(p==NULL)
{
printf("第i-1个节点不存在");
return -1;
}
else
{
if(p->next==NULL)
{
printf("第i个节点不存在");
return -1;
}
else
{
q=p->next;
p->next=q->next;
free(q);
return 1;
}
}
}
/**
对链表进行倒置
**/
void Reverse(LinkList H){
LNode *p,*q;
p=H->next;//p指向第一个数据节点
H->next=NULL;//将原链表值为空
while(p)
{
q=p;
p=p->next;
q->next=H->next;
H->next=q;
}
}
/*对链表中的值进行打印*/
void print_LinkList(LinkList H) {
LNode *p = H->next;
printf("单链表打印出的结果是:");
while (p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
/*单链表中删除重复节点*/
void pur_LinkList(LinkList H) {
LNode *p, *q, *r;
p = H->next; //p指向第一个节点
if (p != NULL) {
while (p->next)
{
q = p;
while (q->next)
{
if (q->next->data == p->data) {
r = q->next;
q->next = r->next;
free(r);
}
else
{
q = q->next;
}
}
p = p->next;
}
}
}
void print(){
LinkList H=NULL;
int i,k,x;
while (1)
{
printf(" 1-使用头插法进行链表的创建\n");
printf(" 2-使用尾插法实现链表的创建\n");
printf(" 3-查看链表的长度\n");
printf(" 4-按序号进行 查找\n");
printf(" 5-按值x进行查找\n");
printf(" 6-进行数据的插入\n");
printf(" 7-进行数据的删除\n");
printf(" 8-对数据进行倒置\n");
printf(" 9-对数据进行打印\n");
printf(" 10-删除单链表中重复的节点\n");
printf("\n请输入你要进行操作的序号:");
scanf("%d", &i);
switch (i)
{
case 1:H = Create_LinkList1();
break;
case 2:H = creat_LinkList2();
break;
case 3:printf("链表的长度为:%d\n",Length_LinkList(H)); break;
case 4:
printf("请输入你要查找的序号:");
scanf("%d", &k);
printf("%d \n", Get_Linklist(H, k)->data); break;
case 5:printf("请输入你要查找的值:");
scanf("%d", &x);
printf("查找的值为:%d\n", Locate_LinkList(H, x)->data); break;
case 6:printf("请输入你要在第几个位置插入的数:");
scanf("%d %d", &k, &x);
Insert_LinkList(H, k, x);
printf("插入成功! \n");
break;
case 7:
printf("请输入您要删除的序号:");
scanf("%d", &k);
Del_LinkList(H, k);
printf("删除成功!\n");
break;
case 8:Reverse(H);
printf("数据倒置成功,请查看!\n");
break;
case 9: print_LinkList(H); break;
case 10: pur_LinkList(H); break;
case 0: exit(0);
}
}
}
int main(void) {
print();
}