头插法和尾插法创建链式循序表并进行遍历循序表、插入、删除、查找元素的操作。
#include <stdio.h>
#include <malloc.h>
/*
线性表的链式存储
*/
typedef struct Node
{
int data;//数据域
struct Node *next;//指针域
} ListNode;
//给节点指针类别取别名
typedef ListNode * LinkList;
/*
头插法创建链表
参数:head代表的头指针,d表示要插入节点的数据
返回值:链表的头指针
*/
LinkList createLinkList(LinkList head,int d)
{
//动态分配内存
LinkList p=(LinkList)malloc(sizeof(ListNode));
//把d放入p节点的数据域
p->data=d;
//让p节点的指针域指向当前的第一个节点
p->next=head;
// 让p作为第一个节点(head指向p)
head=p;
return head;
}
/*
尾插法创建链表
*/
LinkList createLinkList2(LinkList head,int d)
{
//动态分配内存
LinkList q=(LinkList)malloc(sizeof(ListNode));
q->data=d;
q->next=NULL;
if(head==NULL)
{
head=q;
}
else
{
LinkList p=head;
while(p->next!=NULL)
{
p=p->next;
}
p->next=q;
}
return head;
}
LinkList insertlinklist(LinkList head,int x)
{
LinkList p;
//为新节点动态分配内存,找到x应该插入在哪个节点(p)之后)
LinkList q=(LinkList)malloc(sizeof(ListNode));
//把x赋值给q的数据域
q->data=x;
//通过对链表的比较,找到x应该插入在那个节点
LinkList temp;
p=head;
temp=p->next;
if(x<p->data)
{
q->next=head;
head=q;
return head;
}
else{
while(temp->data<x&&temp->next!=NULL)
{
p=p->next;
temp=p->next;
}
if(temp->data>=x){
//让q的next指向p-》next
q->next=p->next;
//让p-》next指向q
p->next=q;
}
else{
temp->next=q;
q->next=NULL;
}
//返回head
return head;
}
}
/*
删除节点
*/
LinkList deleteNode(LinkList head,int d)
{
LinkList q,p;
if(head==NULL)
{
printf("链表尾空\n");
return head;
}
p=head;
if(head->data==d)
{
head=p->next;
free(q);
return head;
}
q=p->next;
while(head!=NULL)
{
if(q->data==d)
{
p->next=q->next;
free(q);
printf("删除成功\n");
return head;
}
q=q->next;
p=p->next;
}
}
/*
查找元素
*/
LinkList selectNode(LinkList head,int d)
{
LinkList p;
p=head;
int q=0;
while(p->next!=NULL)
{
q++;
if(p->data==d)
{
printf("查找成功!\n其位置是%d\n",q);
return p;
}
p=p->next;
}
if(p->data==d){
printf("查找成功!\n其位置是%d\n",q+1);
}
else
printf("链表中没有这个元素!\n");
}
/*
遍历链表
*/
void outputLinkList(LinkList head)
{
LinkList p=head;
printf("链表的内容如下:\n");
while(p!=NULL)
{
printf("%d->",p->data);
p=p->next;
}
}
void main(){
LinkList head=NULL;
int a,data,choice;
printf("情选择创建链表的方式,1:头插法 2:尾插法");
scanf("%d",&a);
switch(a)
{
case 1:
printf("你选择的头插法篡创建链表,请输入元素:");
scanf("%d",&data);
while(data!=-1)
{
head=createLinkList(head,data);
scanf("%d",&data);
}
printf("链表创建成功!\n");
break;
case 2:
printf("你选择的尾插法创建链表,请输入元素:");
scanf("%d",&data);
while(data!=-1)
{
head=createLinkList2(head,data);
scanf("%d",&data);
}
printf("链表创建成功!\n");
break;
}
while(1)
{
printf("选择你要进行的操作:\n");
printf("-------------------------------\n");
printf("1、遍历元素\n");
printf("2、插入\n");
printf("3、删除\n");
printf("4、查找\n");
printf("5、退出程序\n");
printf("------------------------------\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
outputLinkList(head);
break;
case 2:
printf("请输入要插入的元素:\n");
scanf("%d",&data);
head=
insertlinklist(head,data);
break;
case 3:
printf("请输入要删除的元素:\n");
scanf("%d",&data);
head=deleteNode(head,data);
break;
case 4:
printf("请输入要查找的元素:\n");
scanf("%d",&data);
selectNode(head,data);
break;
case 5:
return 0;
default:
printf("输入无效.\n");
}
}
}
我也是用了一个菜单栏的方式来进行一系列的操作。运行结果如下: