链表作为线性表的一种实现方式,有插入删除方便的优点,但不能对节点进行随机访问。同时,要想知道某一节点的前驱节点,必须从头节点开始遍历才能找到,这体现了单链表的方向性。
下面用C语言简单实现一个单向链表:编写一个程序将一个头结点指针为pa的单链表A分解成两个单链表A和B,其头结点指针分别为pa和pb,使得A链表中含有原链表A中序号为奇数的元素,而链表B中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。
#include<stdio.h> #include<malloc.h> #define NULL 0 #define LEN sizeof(List) typedef struct node { int data; struct node * next; }List; int n=0; List *create(void) { List * head; List * p1,* p2; p1=(List*)malloc(LEN); p2=(List*)malloc(LEN); head=NULL; puts("请输入要插入链表的数据(输入0结束):\n"); scanf("%d",&p1->data); while(p1->data!=0) { n++; if(n==1) head=p1; else p2->next=p1; p2=p1; p1=(List*)malloc(LEN); scanf("%d",&p1->data); } free(p1); p2->next=NULL; return head; } void Print(List * head) { List * p; p=head; if(head!=NULL) do { printf("[%d]->",p->data); p=p->next; }while(p!=NULL); } int main() { int m; List * head; List * pa=(List*)malloc(LEN), *pb=(List*)malloc(LEN); List * p1,*p2; head=create(); Print(head); printf("\n"); p1=head; pa=p1; p2=p1->next; pb=p2; while(p2->next!=NULL) { p1->next=p1->next->next; p1=p2->next; if(p1->next==NULL) break; p2->next=p2->next->next; p2=p1->next; } p1->next=NULL; p2->next=NULL; Print(pa); printf("NULL\n"); Print(pb); printf("NULL\n"); //return 0; scanf("%d", &m); }
程序运行结果:
请输入要插入链表的数据(输入0结束): 1 2 3 4 5 6 0 [1]->[2]->[3]->[4]->[5]->[6]-> [1]->[3]->[5]->NULL [2]->[4]->[6]->NULL
本文地址:http://www.nowamagic.net/librarys/veda/detail/1550,欢迎访问原出处。
大家都在看