一个简单的带头尾指针单向链表(C实现)

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

用C写了一个带头尾指针的单向链表,仅在尾部进行插入操作,在任意位置进行删除操作。因为只用到这么些功能,又因为懒,所以没有扩展。因为插入是固定在尾部进行,带一个尾指针的好处是显而易见的。当然删除时要付出一些开销。

list.h

-------------------------------------------

/* list.h

** Copyright 2004 Coon Xu.

** Author: Coon Xu

** Date: 06 Sep 2004

*/

#ifndef LIST_H

#define LIST_H

#include <stdio.h>

#include <stdlib.h>

struct listnode

{

struct listnode* next;

int data;

};

struct list

{

struct listnode* head;

struct listnode* tail;

int count;

};

void list_init(struct list*);

void list_insert(struct list*, struct listnode*);

int list_delete(struct list*, struct listnode*);

#endif

------------------------------------------

list.c

------------------------------------------

/* list.c

** Copyright 2004 Coon Xu.

** Author: Coon Xu

** Date: 06 Sep 2004

*/

#include "list.h"

void list_init(struct list* myroot)

{

myroot->count = 0;

myroot->head = NULL;

myroot->tail = NULL;

}

void list_insert(struct list* myroot, struct listnode* mylistnode)

{

myroot->count++;

mylistnode->next = NULL;

if(myroot->head == NULL)

{

myroot->head = mylistnode;

myroot->tail = mylistnode;

}

else

{

myroot->tail->next = mylistnode;

myroot->tail = mylistnode;

}

}

int list_delete(struct list* myroot, struct listnode* mylistnode)

{

struct listnode* p_listnode = myroot->head;

struct listnode* pre_listnode;

//myroot is empty

if(p_listnode == NULL)

{

return 0;

}

if(p_listnode == mylistnode)

{

myroot->count--;

//myroot has only one node

if(myroot->tail == mylistnode)

{

myroot->head = NULL;

myroot->tail = NULL;

}

else

{

myroot->head = p_listnode->next;

}

return 1;

}

while(p_listnode != mylistnode && p_listnode->next != NULL)

{

pre_listnode = p_listnode;

p_listnode = p_listnode->next;

}

if(p_listnode == mylistnode)

{

pre_listnode->next = p_listnode->next;

myroot->count--;

return 1;

}

else

{

return 0;

}

}

-------------------------------------------

main.c

-------------------------------------------

#include <stdio.h>

#include <stdlib.h>

#include "list.h"

int main(int argc, char *argv[])

{

struct list l;

list_init(&l);

int ix = 0;

for(ix = 0; ix < 10; ix++)

{

struct listnode* p_node = malloc(sizeof(struct listnode));

p_node->data = ix;

list_insert(&l, p_node);

}

struct listnode* p_listnode = l.head;

while(p_listnode != NULL)

{

printf("%d\n", p_listnode->data);

p_listnode = p_listnode->next;

}

int input;

printf("input the number you want delete:\n");

scanf("%d", &input);

while(input > 0)

{

p_listnode = l.head;

while(p_listnode->next != NULL && p_listnode->data != input)

{

p_listnode = p_listnode->next;

}

if(p_listnode->data == input)

{

printf("Delete success!!\nprint the list!!\n");

list_delete(&l, p_listnode);

free(p_listnode);

p_listnode = l.head;

while(p_listnode != NULL)

{

printf("%d\n", p_listnode->data);

p_listnode = p_listnode->next;

}

}

else

{

printf("not find %d\n", input);

}

scanf("%d", &input);

}

system("PAUSE");

return 0;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航