#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int datatype ;
typedef struct node
{
datatype data;
struct node *next;
}listnode , *linklist;
int length;//表长
linklist create_list(int len)//建立链表(尾插法)
{
linklist head = (linklist)malloc(sizeof(linklist));//设立一个头结点
listnode *p,*rear;
rear = head;
while(len --)
{
p = (listnode*)malloc(sizeof(listnode));
scanf("%d",&p->data);
rear->next = p;
rear = p;
}
rear->next = NULL;
return (head);
}
/*-----------------------------------------------------------------------------
//头插法(建好的链表元素顺序与输入的顺序相反)
linklist create_list(int len)
{
linklist head = (linklist)malloc(sizeof(linklist));//设立一个头结点
listnode *p;
head->next= NULL;
while(len --)
{
p = (listnode*)malloc(sizeof(listnode));
scanf("%d",&p->data);
p->next = head->next;
head->next = p;
}
return (head);
}
-----------------------------------------------------------------------------*/
int insert_list(linklist head,int e,int m)//插入
{
if(m < 1||m > length + 1)
return ERROR;
listnode *p = head,*r;
int i = 1;
while(i < m)
{
p = p->next;
i++;
}
r = (listnode*)malloc(sizeof(listnode));
r->data = e;
r->next = p->next;
p->next = r;
length ++;
return OK;
}
int del_list(linklist head,int m)//删除
{
if(m < 1||m > length)
return ERROR;
int j = 0;
listnode *p = head,*r;
while(p->next && j < m-1)
{
p = p->next;
j ++;
}
if(j > m-1 || p->next == NULL)
return ERROR;
r = p->next;
p->next = r->next;
free(r);
length --;
return OK;
}
int get_list(linklist head,int e)//(按址)查找
{
linklist p = head;
int i = 0;
while(p->next)
{
i ++;
p = p->next;
if(p->data == e)
break;
}
if(p->data == e)
return i;
return 0;
}
void print_list(linklist head)//打印
{
linklist p = head;
printf("当前链表为:");
if(p->next == NULL)
{
printf("空表!\n");
return ;
}
while(p->next)
{
p = p->next;
printf("%d ",p->data);
}
printf("\n当前表长度为: %d\n",length);
}
int empity_list(linklist head)//判定是否为空表
{
if(head->next)
return OK;
return ERROR;
}
int clear_list(linklist head)//清空
{
listnode *p = head,*r;
while(p->next)
{
r = p->next;
p->next = r->next;
free(r);
}
if(p->next)
return ERROR;
length = 0;
return OK;
}
int main(int argc, char *argv[])
{
linklist head = NULL;
int n,i,e;
printf("请输入要创建链表的长度:");
scanf("%d",&length);
printf("输入%d个数据并以空格隔开\n",length);
head = create_list(length);
printf(head != NULL ? "创建成功!" : "创建失败!");
print_list(head);
printf("输入要删除的个数:");
scanf("%d",&n);
for(i = 1;i <= n;i ++)
{
printf("输入第%d个元素所在位置\n",i);
scanf("%d",&e);
if(!del_list(head,e))
printf("删除失败,检查数据是否有误!\n");
else
printf("删除成功!\n");
print_list(head);
}
printf("输入要插入的元素个数:");
scanf("%d",&n);
int loc;
for(i = 1;i <= n;i ++)
{
printf("输入第%d个要插入的元素及要插入的位置,以空格隔开!\n",i);
scanf("%d%d",&e,&loc);
printf(insert_list(head,e,loc) ? "插入成功!\n" : "插入失败,检查数据是否有误!\n");
print_list(head);
}
printf("输入要查找的元素个数:");
scanf("%d",&n);
for(i = 1;i <= n;i ++)
{
printf("输入第%d个要查找的元素\n",i);
scanf("%d",&e);
int m = get_list(head,e);
if(!m)
printf("表中不存在此元素!\n");
else
printf("表中第%d个节点中的元素!\n",m);
}
print_list(head);
getchar();
printf("是否清空链表?y/n \n");
char ch;
scanf("%c",&ch);
if(ch == 'y')
{
clear_list(head);
printf(empity_list(head) ? "清空失败!\n" : "清空成功!\n");
}
print_list(head);
printf("操作结束!\n");
system("PAUSE");
return 0;
}
/*--------------------------------------------------------------
PS:归并两个链表
linklist bing_list(linklist head1,linklist head2)
{
if(head2->next == NULL)
return (head1);
linklist p = head1,q = head2;
while(p->next)
p = p->next;
p->next = head2->next;
return (head1);
}
---------------------------------------------------------------*/
单链表的各种操作(建立,查找,删除,插入,归并等)
最新推荐文章于 2021-04-12 12:07:36 发布