单向链表中的结点结构如下:
typedef struct node { char info; struct node *link; }NODE;
其中数据域存放线性表中元素的值,指针域保存指向下一个元素的指针(即下一个元素的地址)。链表中至少需要一个头指针head和表头节点。
其中head是指向向前链表表头的指针,表头是一个特殊的结点,它的数据域不存放普通的数据,而是闲置不用或存放特殊信息,表头节点的指针域存放链表的第一个结点的地址,当单向链表为空时,表头结点的指针域为空值NULL。
例子:利用单向链表实现集合运算(A-B)U(B-A)。题意分析:即是要分别创建两个链表,在将其中相同的元素删除,不同的元素进行插入操作。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 tyoedef struct node 5 { 6 char info; /*store the data of the element*/ 7 struct node *link; /*store the address of the next element*/ 8 }NODE; 9 10 /****************************************************************************** 11 **function: listCreate 12 **description:create a list 13 **input: no 14 **return: reurn the head pointer 15 ******************************************************************************/ 16 NODE *listCreate () 17 { 18 NODE *head, *p1, *p2; 19 cahr ch; 20 head = (NODE *)malloc(sizeof(NODE)); /*create the head node*/ 21 head->link = NULL; 22 p1 = head; 23 while((ch = getchar()) != ' ') 24 { 25 p2 = (NODE *)malloc(sizeof(NODE)); /*create a new node */ 26 p2->info = ch; 27 p2->link = NULL; 28 29 p1->link = p2; /*insert the new node */ 30 p1 = p2; 31 } 32 return (head); 33 } 34 35 /*************************************************************************** 36 **function: listTravel 37 **description:travel the element of the list 38 **input: the pointer to the node 39 **return: void 40 **************************************************************************/ 41 void listTravel(NODE *ptr) 42 { 43 ptr = ptr->link; 44 while(ptr != NULL) 45 { 46 printf("%c ", ptr->info); 47 ptr = ptr->link; /*enable the ptr point to the next node*/ 48 } 49 printf(" "); 50 } 51 52 /******************************************************************** 53 **function: listProcess 54 **description:process the data of list 55 **input: two node point la,lb 56 **return: reurn a new pointer of the list 57 *******************************************************************/ 58 NODE *listProcess(NODE *la, NODE *lb) 59 { 60 NODE *ptr, *p1, *p2; 61 int found = 0; 62 63 ptr = lb->link; 64 while(ptr != NULL) 65 { 66 p1 = la->link; 67 p2 = la; 68 while(p1 != NULL && !found) 69 { 70 if(p1->info == ptr->info) /*if the two datas equals*/ 71 { 72 found = 1; 73 } 74 else /*point the next element*/ 75 { 76 p2 = p1; 77 p1 = p1->link; 78 } 79 } 80 if(found) /*delete the node */ 81 { 82 p2->link = p1->link; 83 free(p1); 84 found = 0; 85 } 86 else /*insert the node */ 87 88 { 89 p1 = (NODE *)malloc(sizeof(NODE)); 90 p1->info = ptr->info; 91 p1->link = NULL; 92 p2->link = p1; 93 } 94 95 ptr = ptr->link; /*compare the next element */ 96 } 97 return (la); 98 } 99 100 /******************************************************************* 101 **function: main 102 **description:complete the task 103 **input: void 104 **return: 0 105 *******************************************************************/ 106 int main(int argc, char *argv[]) 107 { 108 NODE *la, *lb; 109 110 printf(" the element of the list A: "); 111 la = listCreate(); 112 listTravel(la); 113 114 printf(" the element of the list B: "); 115 lb = listCreate(); 116 listTravel(lb); 117 118 la = process(la, lb); 119 printf("the list (A-B)U(B-A) is "); 120 listTravel(la); 121 122 return 0; 123 }