c语言中,如何实现链表,让链表的数据域类型是多个结构体。

Python016

c语言中,如何实现链表,让链表的数据域类型是多个结构体。,第1张

链表有多种形式,如:单向链表,双向链表,单向循环链表,双向循环链表。将链表结构定义为list_t,则该类型中一定(至少)存在一个指向下一节点的指针list_t

*next除了这个指针,list_t

中可以包含其它类型的数据,包括结构体变量。比如:typedef

struct

{

struct

usr_struct

data

list_t

*next

}

list_t

#include <stdio.h>

#include <stdlib.h>

typedef int DataType

typedef struct node {

DataType member

struct node *next

}*LinkList, *pNode

// 初始化链表

LinkList GetEmptyList() {

LinkList head = (pNode)malloc(sizeof(struct node))

head->member = 0

head->next = NULL

return head

}

// 在非增链表中插入结点

void InsertNode(LinkList head, DataType x) {

pNode p,q

for(p = head p->next != NULL p = p->next) {

if(p->next->member <= x) {

q = (pNode)malloc(sizeof(struct node))

q->member = x

q->next = p->next

p->next = q

return

}

}

q = (pNode)malloc(sizeof(struct node))

q->member = x

q->next = p->next

p->next = q

}

// 新结点插入为首结点

void PushNode(LinkList head, DataType x) {

pNode p = (pNode)malloc(sizeof(struct node))

p->member = x

p->next = head->next

head->next = p

}

// 删除结点

int DeleteNode(LinkList head, DataType x) {

pNode p,q

for(p = head p != NULL p = p->next) {

if(p->next->member == x) {

q = p->next

p->next = q->next

free(q)

return 1 // 成功删除member(第一个)为x的结点

}

}

return 0 // 没有找到member为x的结点

}

// 查找结点

int FindNode(LinkList head, DataType x) {

pNode p

for(p = head->next p != NULL p = p->next) {

if(p->member == x) return 1 // 找到了

}

return 0 // 没有找到

}

// 销毁链表

void DestroyList(LinkList head) {

pNode q,p = head

while(p) {

q = p

p = q->next

free(q)

}

head = NULL

}

// 遍历链表

void ShowList(LinkList head) {

pNode p = head->next

while(p != NULL) {

printf("%d ",p->member)

p = p->next

}

printf("\n")

}

int main() {

DataType x,res

LinkList head = GetEmptyList()

printf("输入一个整数('q' to quit): ")

while(scanf("%d",&x) == 1) {

InsertNode(head, x) // 创建非增链表

printf("输入一个整数('q' to quit): ")

}

fflush(stdin)

ShowList(head)

printf("输入待查找的整数: ")

scanf("%d",&x)

res = FindNode(head, x)

if(res) printf("找到了。\n")

else printf("没找到!\n")

printf("输入待删除的整数: ")

scanf("%d",&x)

res = DeleteNode(head, x)

if(res) printf("成功删除。\n")

else printf("没找到数据为:%d的结点!\n",x)

ShowList(head)

DestroyList(head)

return 0

}

用对应类型的指针数组存储链表各节点地址,对应类型的指针变量存储指针数组名+1的地址,查找链表中倒数第k个位置上的结点(k为正整数),则是判断对应类型的指针变量-1-k的值不小于对应类型的指针数组的地址,为真,则通过*(指针变量-1-k)->date输出,并返回1;为假,只返回0。

这样不用每次都去遍历链表,只要将链各节点地址存储一次表,只是程序的存储空间大了些,但是可以实现多次的快速查找,执行效率高,特别是在较大的链表上!!

(还可以用指针数组元素个数与K比较,不小于为真,则通过指针数组名(指针数组元素个数-1-k)->date输出,并返回1;为假,只返回0。)