基于单链表的操作

单链表

功能设计

1从首元结点开始输出数据域即p->data直到p->next=NULLtypedef struct Node

定义一个链式存储的单链表Node *为结构体指针类型例如对于单链表Lp=L―〉next通过p->data 访问该元素的数据值。

2creatlist(linklist *H)

从空表开始每次读入数据生成新结点将读入的数据存放到新结点的数据域中然后将新结点插入到当前链表的表头结点之后直至读入结束位置为止。

3Leng(linklist *H )

 在单链表中整个链表由“头指针”来表示单链表的长度在从头到尾遍历的过程中统计计数。

4GetElem(linklist *H,int i)

要查找单链表的第i个结点则需要从单链表的头指针出发顺着链域扫描用指针p指向当前扫描到的结点处治指向头结点用k作计数器j==i时指针p指向的结点就是要查找的第i个结点。

5Insert(linklist *H,int i,int x)

查找在单链表中找到第i-1个结点并有指针pre 指示。

申请申请新结点s将其数据域的值置为e

插入元素通过修改指针域将新元素插入链表。

6Delete(linklist *H,int x)

通过计数方式第i-1个结点并由pre指针指示。

删除第i个结点并释放结点空间。

7print(linklist *H)

链表操作示意图

1单链表

wKiom1acv9jDhjptAAAT-IhPV-g612.png

2头插法构造单链表

wKioL1acwCDBQHKxAAAYbQMWoWo685.png

3尾插法构造单链表

wKioL1acwfOwy04aAAAZIE11sb4972.png


3单链表结点的删除

wKiom1acwAXCpOicAAAX_YCtxpg319.png


代码

#include<stdio.h>

#include<stdlib.h>

typedef struct node

{

int data;

struct node *next;

}linklist;

 

 

void setnull(linklist *H)

{

H->next=NULL;

}

void creatlist(linklist *H)

{

linklist *p,*s;

 int x;

p=H;

printf("please input x:");

scanf("%d",&x);

while(x!=-1)

{

s=(linklist *)malloc(sizeof(linklist));

s->data=x;

s->next=p->next;

p->next=s;

p=p->next;

printf("please input x:");

scanf("%d",&x);

}

p->next=NULL;

}

 

void Leng(linklist *H )

{

linklist *p;

int k;

p=H;

k=0;

while(p->next!=NULL)

{

p=p->next;

k++;

}

printf("The linklist is:%d\n",k);

}

  

  

int GetElem(linklist *H,int i)

{

linklist *p;

int k;

p=H;

k=0;

while(p->next!=NULL&&k<i)

{

p=p->next;

k++;

}

if(k==i&&p!=NULL)

printf("i position data is %d\n",p->data);

else

printf("No find!\n");

return 0;

}

void Insert(linklist *H,int i,int x)

{

linklist *p;

int k;

linklist *s;

p=H;

k=0;

while(p->next!=NULL&&k<i-1)

{

p=p->next;

k++;

}

if(k==i-1&&p->next!=NULL)

{

s=(linklist *)malloc(sizeof(linklist));

s->data=x;

s->next=p->next;

p->next=s;

}

else

printf("插入错误");

}

void Delete(linklist *H,int x)

{

linklist *p,*q;

int k;

p=H;

k=0;

while(p->next!=NULL&&p->next->data!=x)

{

p=p->next;

k++;

}

if(p->next->data==x)

{

q=p->next;

p->next=q->next;

free(q);

}

else printf("no find!\n");

}

 

void print(linklist *H)

{

linklist *p;int k;

p=H;

k=0;

if(p->next==NULL)

printf("链表为空!");

while(p->next!=NULL)

{

k++;

p=p->next;

printf("%3d",p->data);

}

}

int Locate(linklist *H,int x)

{

linklist *p;int k;

p=H;

k=0;

while(p->next!=NULL&&p->data!=x)

{

p=p->next;

k++;

}

if(p->data==x)

printf("要查询元素的位置%d\n",k);

else

printf("没有找到!\n");

return 0;

}

int  main()

{

linklist *H;

int k,x,i;

int f;

H=(linklist *)malloc(sizeof(linklist));

setnull(H);

printf("\n请选择以下操作数,选择-1为结束");

printf("\n1:createlinklist(H)");

printf("\n2:leng(H)");

printf("\n3:GetElem(H,i)");

printf("\n4:Insert(H,i,x)");

printf("\n5:Delete(H,x)");

printf("\n6:print(H)");

printf("\n7:Located(H,x)\n");

scanf("%d",&f);

while(f!=-1)

{

switch(f)

{

case 1:

creatlist(H);

break;

case 2:

Leng(H);

break;

case 3:

printf("请输入要得到的元素");

scanf("%d",&i);

GetElem(H,i);

break;

case 4:

printf("\n请输入插入的位置长度以及元素");

scanf("%d,%d",&i,&x);

Insert(H,i,x);

break;

case 5:

printf("\n请输入要删除的位置元素");

scanf("%d",&x);

Delete(H,x);

break;

case 6:

print(H);

break;

case 7:

printf("请输入要查找的元素:");

scanf("%d",&x);

Locate(H,x);

break;

}

printf("\n请选择以下操作数,选择-1为结束");

printf("\n1:creatlinklist(H)");

printf("\n2:leng(H)");

printf("\n3:GetElem(H,i)");

printf("\n4:Insert(H,i,x)");

printf("\n5:Delete(H,x)");

printf("\n6:print(H)");

printf("\n7:Locate(H,x)\n");

scanf("%d",&f);

}

return 0;

}

 


你可能感兴趣的:(最形象生动的单链表)