最近在学数据结构,看的是《数据结构与算法分析》这本书,尝试着写了下链表和二叉树;
#include <stdio.h>
#include <stdlib.h>
typedef struct NODE{
struct NODE *next;
int data;
}Node;
typedef Node *PtrToNode;
typedef PtrToNode Linklist;
Linklist find(int x,Node *head)
{
Node *p;
p = head;
while(p!=NULL && p->data!=x)
{
p = p->next;
}
if(p==NULL)
{
printf("not find\n");
}
return p;
}
void Delete(int x,Node *head)
{
Node *p,*prev;
p = head;
while(p!=NULL && p->data!=x)
{
prev = p;
p = p->next;
prev->next = p;
}
if(p==NULL) {
printf("not exist\n");
}
else
{
prev->next = p->next;
free(p);
}
return;
}
void insert(int x,int position,Node *head)//在已有链表插入将数据x第position位
{
Node *p,*current,*prev;
p = head;
while(position--)
{
prev = p;
p = p->next;
prev->next = p;
if(p==NULL)
break;
}
if(p==NULL && position != 0)//如果超过链表长度则不插入
{
printf("too large position\n");
}
else{
current = (Node *)malloc(sizeof(Node));
current->data = x;
prev->next = current;
current->next = p;
}
return;
}
Linklist create1()//尾插法,正序输出
{
int x;
Node *head,*current,*prev;
head = NULL;
while(scanf("%d",&x)!=EOF)
{
current = (Node *)malloc(sizeof(Node));
current->data = x;
if(head==NULL)
{
head = current;//头结点指向第一个结点
}
else{
prev->next = current;//前一个结点的next指向当前节点,即完成插入
}
current->next = NULL;//当前的结点始终为已生成链表的最后一个结点因此next指向NULL
prev = current;//完成插入后的当前结点即是下一次插入的前一个结点,等待下一次插入
}
return head;
}
Linklist create2()//头插法创建单链表,从头结点遍历输出为输入的倒序
{
int x;
Node *head;
head = NULL;
while(scanf("%d",&x)!=EOF)
{
Node *p;
p = (Node *)malloc(sizeof(Node));
p->data = x;
p->next = head;//将当前结点插入链表的头即将其next指向头结点
head = p;//头结点始终为最新插入的结点
}
return head;
}
int main()
{
int x,position;
Node *p,*head;
head = create1();
p = head;
scanf("%d%d",&x,&position);
insert(x,position,head);
while(p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
system("pause");
return 0;
}