链表的常见用法
来源:互联网 发布:c语言printf输出汉字 编辑:程序博客网 时间:2024/05/19 19:34
#include <stdio.h>
#include <malloc.h>
#define ElemType int
typedef struct Node
{
ElemType Data;
struct Node * Next;
}LNode,*LinkList;
LinkList CreatLNode_Tail_Insert( ) //尾插法建立链表
{
LinkList Head;
Head=(LinkList)malloc(sizeof(LNode));
LNode *S,*R;
ElemType Elem;
Head->Next=NULL;
R=Head;
printf("请输入数字,以0终止输入\n");
scanf("%d",&Elem);
while(Elem!=0)
{
S=(LinkList)malloc(sizeof(LNode));
S->Data=Elem;
S->Next=NULL;
R->Next=S;
R=S;
scanf("%d",&Elem);
}
return Head;
}
int Get_Length_Linklist(LinkList Head)//求表长
{
LNode *p;
int j=0;
p=Head;
while(p->Next!=NULL)
{
p=p->Next;
j++;
}
return j;
}
ElemType Search(LinkList Head,int k) //查找第K个结点
{
LNode *p;
int length;
int i;
p=Head;
length=Get_Length_Linklist(Head);
if(length==0||length<k||k==0)
{
return 0;
}
else
{
for(i=0;i<k;i++)
{
p=p->Next;
}
return p->Data;
}
}
void Insert(LinkList Head,ElemType Elem,int K)//将数据域为Elem的结点插到第K的结点之后
{
int length=0;
LNode *p,*S;
int i;
p=Head;
S=NULL;
length=Get_Length_Linklist(Head);
if(K>length)
{
printf("查找失败,没有第K个结点\n");
}
else
{
for(i=0;i<K;i++)
{
p=p->Next;
}
S=(LinkList)malloc(sizeof(LNode));
S->Data=Elem;
if(K==length)
{
S->Next=NULL;
p->Next=S;
}
else
{
S->Next=p->Next;
p->Next=S;
}
}
}
void Delete_Node(LinkList Head,int K)//删除第K个结点
{
int length=0;
LNode *p,*q;
int i;
p=Head;
q=NULL;
length=Get_Length_Linklist(Head);
if(K>length)
{
printf("查找失败,没有第 %d 个结点\n",K);
}
else
{
for(i=0;i<K-1;i++)//查找被删除结点的上一个结点
{
p=p->Next;
}
q=p->Next;//q 指向被删除结点
if(K==length)
{
p->Next=NULL;
}
else
{
p->Next=q->Next;
}
free(q);
}
}
void Print (LinkList Head)
{
LinkList p;
p=Head;
while(p->Next!=NULL)
{
p=p->Next;
printf("%d ",p->Data);
}
printf("\n");
}
int Destroy_LinkList(LinkList Head)//销毁链表
{
LinkList p,q;
p=Head;
q=p->Next;
while(q->Next!=NULL)
{
free(p);
p=q;
q=q->Next;
}
free(p);
free(q);
return 0;
}
int main(void)
{
LinkList head;
int length=0;
int search_num;
int found;
ElemType elem;
int insert_dir;
int delete_dir;
head=CreatLNode_Tail_Insert();
Print(head);
length=Get_Length_Linklist(head);
printf("链表长度:%d\n",length);
printf("请输入待查找结点序号:");
scanf("%d",&search_num);
found=Search(head,search_num);
if(found==0)
{
printf("查找失败,没有第 %d 个结点\n",search_num);
}
else
{
printf("查找成功,第 %d 个结点的数据是 %d \n",search_num,found);
}
printf("请输入待插入结点数据,插入位置\n");
scanf("%d",&elem);
scanf("%d",&insert_dir);
Insert(head,elem,insert_dir);
Print(head);
printf("请输入待删除结点位置\n");
scanf("%d",&delete_dir);
Delete_Node(head,delete_dir);
Print(head);
Destroy_LinkList(head);
return 0;
}
- 链表的常见用法
- 顺序表的初始化(常见用法)
- sqlserver 系统表的常见用法
- cookies的常见用法
- Intent的常见用法
- jad 常见的用法
- Intent的常见用法
- const的常见用法
- const的常见用法
- const的常见用法
- const的常见用法
- MessageBox的常见用法
- MessageBox的常见用法
- css的常见用法
- MessageBox的常见用法
- MessageBox的常见用法
- MessageBox的常见用法
- MessageBox的常见用法
- JSON
- 使ssh不用输入密码
- unity设置字体大小
- 细谈 Web Api 图片上传,在使用 Task.ContinueWith 变量无法赋值问题的解决办法!
- hdu 1159
- 链表的常见用法
- 项目小总结
- [Rx86OS-III] 由实模式切换到保护模式
- struts2 能进入action 不执行execute的问题
- JQUERY MOBILE 控件的一些refresh
- C# FileSystemWatch使用
- 有些代码不应该被忘记,也没有源代码不应该被记住。
- installshield2009打包工具使用方法
- Vijava 学习笔记之 VirtualMachine(状态(通电状态))