您的位置:首页 > 其它

链表的简单操作

2017-05-02 13:39 127 查看
链表的简单操作大致包括:头插法尾插法建立链表,遍历链表,删除添加结点。

#include<stdio.h>
#include<malloc.h>
typedef struct Node
{
int data;
struct Node *next;
}Node;
void print(Node *head)          .//遍历链表
{
Node *p;
p = head;
while(p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
return ;
}
Node *create_linklist(int n)                //头插法建立链表
{
int i;
int d;
Node *head = NULL,*p;
for(i = 0; i < n; i ++)                      //将新结点插到开头的位置
{
scanf("%d",&d);
p=(Node *)malloc(sizeof(Node));
p->data = d;
p->next = NULL;
if(head == NULL)
head = p;
else
{
p->next = head;
head = p;
}
}
return head;
}
/*Node *create_linklist(int n)  //创建链表 ,尾插法
{
Node *head = NULL;
Node *p,*last;
int d;
int i;
for(i=0; i<n; i++)
{
scanf("%d",&d);
p = (Node *)malloc(sizeof(Node));
p->data = d;
p->next = NULL;
if(head == NULL)
head = p;
else
last->next = p;
last= p;
}
return head;
}*/
Node *insert_node(Node *head,int b) //插入大小为b的结点
{
Node *pre1 = head,*pre2,*p;
p = (Node *)malloc(sizeof(Node));
p->data = b;
if(head == NULL)
{
head = p;
p->next = NULL;
}
else if(p->data < head->data)
{
head = p;
p->next = pre1;
}
else
{
while(pre1 != NULL && p->data >= pre1->data)
{
pre2 = pre1;
pre1 = pre1->next;
}
p->next = pre1;
pre2->next = p;
}
return head;
}
Node *delete_node(Node *head ,int b)    //删除元素为b的结点
{
Node *p,*pre;
p = head;
if(head == NULL)
printf("List is null,delete failed.\n");
else
{
while(b != p->data && p->next != NULL)
{
pre = p;
p = p->next;
}
if(b == p->data)
{
if(p == head)
head = p->next;
else
pre->next = p->next;
free(p);
}
else
printf("%d not found,delete fail.\n",b);
}
return head;
}

Node *delete_n_node(Node *head,int n)   //删除第N个结点
{
int i = 1;
Node *p,*pre;
p = head;
if(head == NULL)
printf("List is null,delete failed.\n");
else if(n==1)
{
head == head->next;
}
else
{
while(p->next != NULL)
{
i++;
pre = p;
p = p->next;
if(i == n)
break;
}
if(p ->next == NULL)
printf("there is less than %d.\n",n);
else
pre->next = p->next;
free(p);
}
return head;
}
Node *insert_n_node(Node *head, int n)  //在第N个结点后面插入一个结点
{
int b;
int i = 0;
Node *pre2,*pre1 = head,*p;
p = (Node *)malloc(sizeof(Node));
scanf("%d",&b);
p->data = b;
p->next = NULL;
if(n == 0)
{
head = p;
p->next = pre1;
}
else
{
while(pre1 != NULL && i != n)
{
pre2 = pre1;
pre1 = pre1->next;
i++;
}
if(i == n)
{
p->next = pre2->next;
pre2->next = p;
}
else
printf("NULL\n");
}
return head;

}
int main()
{
int n,b;
Node *head = NULL;

scanf("%d",&n);
head = create_linklist(n);
print(head);

scanf("%d",&b);
head = delete_node(head,b);
print(head);

scanf("%d",&b);
head = insert_node(head,b);
print(head);

scanf("%d",&n);
head = delete_n_node(head,n);
print(head);

scanf("%d",&n);
head = insert_n_node(head,n);
print(head);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: