James Bryant

【转】C语言实现链表及其操作

0
阅读(1428)

#include  #include  //定义节点 typedef struct Node { int data; struct Node * PNext; }*PNode,Node; //初始化函数 PNode create_list();//创建节点 //打印出链表 void traverse_list(PNode); //删除节点pos 从1 开始 void delete_node(PNode,int,int *); //插入节点 pos 从1开始 void insert_data(PNode,int ,int ); void main() { //int val; //定义头指针 PNode PHead=NULL; PHead=create_list(); //delete_node(PHead,-1,&val); insert_data(PHead,-2,2); traverse_list(PHead); } PNode create_list() { int len; int i; int val; //定义头节点 PNode PHead=(PNode)malloc(sizeof(Node)); //内存不足等情况会出现分配内存失败的情况 发生错误会返回NULL if(PHead == NULL){ printf("内存分配失败"); } PNode Ptail=PHead; //将头节点的指针域指向NULL 如果没有首节点指针域就是NULL Ptail->PNext=NULL; /* 思路: 定义节点ptail,永远指向尾节点,一开始只有头结点 头结点也是尾节点,所以指向头结点 将新建的PNew节点挂载到ptail节点后面,挂载好之后,ptail指向新建的PNew节点,这样保证ptail永远指向尾节点 */ printf("请输入初始化节点的数量\n"); scanf("%d",&len); for(i=0;idata=val; Ptail->PNext=PNew; PNew->PNext=NULL; Ptail=PNew; } //返回首节点 return PHead; } void traverse_list(PNode PHead) { PNode p = PHead->PNext; //printf("%d\n",PHead->PNext); if(p == NULL) { printf("链表为空\n"); exit(0); } while(p != NULL){ printf("%d\n",p->data); p=p->PNext; } } void delete_node(PNode PHead,int pos,int * val) { int i=0; if(PHead->PNext==NULL){ printf("节点为空"); exit(0); } if(pos <0){ printf("没有数据"); exit(0); } PNode p=PHead; PNode t; PNode r; while(i != pos){ //printf("%d\n",i=t->data);exit(0); t=p; if(i == pos-1){ //printf("%d\n",i=p->PNext->PNext->data);exit(0); //exit(0); r=p->PNext; t->PNext=p->PNext->PNext; free(r); r=NULL; //exit(0); return; } i++; p=p->PNext; } } void insert_data(PNode PHead,int pos,int val) { int i=0; PNode p=PHead; while(p != NULL && iPNext; i++; } if(p == NULL || i>pos -1){ printf("插入错误"); return ; } PNode PNew=(PNode)malloc(sizeof(Node)); if(PNew == NULL){ printf("内存分配失败"); exit(-1); } PNode t=p->PNext; PNew->data=val; PNew->PNext=t; p->PNext=PNew; }
Baidu
map