/*2015-1-13 [watchmen 数据结构和算法] 链表和数组
** 链表操作,头部,尾部和中间节点的插入 中间没写
** 删除其中的一个节点数据
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct list{//创建单链表的结构体
int data;
struct list *next;
}listnode, *linklist;
linklist head_insert(linklist head, linklist newnode)
{//从head插入节点
assert(newnode);//检查new是否为null
newnode->next = head;
head = newnode;
return head;
}
linklist tail_insert(linklist head, linklist newnode)
{//从tail插入 1.首先要找到tail
assert(newnode);
if(head == NULL)
{//如果为空链表,新的节点即为头指针
head = newnode;
}
else
{
linklist temp = head;
while(temp->next != NULL)
temp = temp->next; //当temp->next 为NULL 时,temp为最后的节点
newnode->next = NULL; //新节点指向空
temp->next = newnode; //最后节点指向新的节点
}
return head;
}
linklist delnode(linklist head, int data)
{
linklist temp = head;
if(temp == NULL)
return NULL;
if(temp->data == data)
{//删除第一个节点
head = head->next;
free(temp);
return head;
}
linklist prev = head;
temp = head->next;
while(temp != NULL && temp->data != data)
{
prev = temp;
temp = temp->next;
}
if(temp == NULL)
return NULL;
prev->next = temp->next;
free(temp);
return head;
}
void output(linklist head)
{//链表输出
linklist temp = head; //----曾编程错误-_-||------linklist temp------------
while(temp)
{
printf("%d ",temp->data);
temp = temp->next;
}
printf("\n");
}
int main(int argc,char *argv[])
{
linklist head = NULL;
srand(time(NULL));
int i;
for(i=0;i<10;i++)
{
linklist newnode = (linklist)malloc(sizeof(listnode));
newnode->data = rand()%100;
newnode->next = NULL;
// head = head_insert(head,newnode);
head = tail_insert(head,newnode);
output(head);
// getchar();
}
/******删除操作*****/
printf("pls input the delete data>>>");
int number = 0;
scanf("%d",&number);
linklist temp = delnode(head, number);
if(NULL == temp)
{
printf("del failure or not has this node\n");
}
else
{
head = temp;
output(head);
}
return 0;
}
操作链表 ,应该首先操作新的节点后操作相应的指针指向
增加:(1) 在头部增加 newnode->head; head = newnode;
(2)在尾部增加 newnode->NULL; tail = newnode; 首先要找到tail , 分空和不为空
删除:(1)查找数据节点 链表为空, 删除的第一个节点数据; 中间数据