- 论坛徽章:
- 0
|
各位大牛们好,请问在一个已创建的单向链表中插入一个新数据后再执行销毁链表操作没有将这个新插入的结点删除,是否有什么好办法?
代码如下:- #include <stdio.h>
- #include <unistd.h>
- #define stLen sizeof(stNode)
- typedef struct student
- {
- char sname[10];
- int iage;
- struct student *next;
- }stNode;
- //创建一个定长的单向链表
- stNode *create(int num)
- {
- stNode *p,*q,*head;
- int icount = 0;
- p = q = (stNode *)malloc(stLen);
-
- head = NULL;
- while(num--)
- {
- icount++;
- p = (stNode *)malloc(stLen);
- scanf("%s%d",&p->sname,&p->iage);
- if(icount == 1) head = p;
- else q->next = p;
- p->next = NULL;
- q = p;
- }
- q->next = NULL;
- return head;
- }
- //链表数据打印输出
- void myprint(stNode *node)
- {
- if(node == NULL)
- {
- printf("输入的链表为空,链表不能为空!\n");
- exit (-1);
- }
- while(node)
- {
- printf("name->[%s],age->[%d]\n",node->sname,node->iage);
- node = node->next;
- }
- }
- //计算链表长度
- int Node_Length(stNode *node)
- {
- int iLength = 0;
- while(node){
- node = node->next;
- iLength++;
- }
- return iLength;
- }
- //删除指定位置记录
- stNode *Node_Delete(stNode *node,int inum)
- {
- stNode *p1,*p2;
- int node_length = 0,iRun = 0;
- if(node == NULL)
- {
- printf("输入的链表为空,链表不能为空!\n");
- exit (-1);
- }
- p1 = node;
- node_length = Node_Length(node);
- if(node_length < inum)
- {
- printf("输入的链表长度[%d]不足[%d]\n",node_length,inum);
- exit (-1);
- }
- while(iRun++ < (inum-1))
- {
- p2 = p1;
- p1 = p1->next;
- }
- if(p1 == node)
- {
- if(node_length == 1)
- {
- free(node);
- node = NULL;
- }
- else node = p1->next;
- free(p1);
- }
- else p2->next = p1->next;
- return node;
- }
- //插入新数据到链表指定位置
- stNode *Node_Insert(stNode *node,stNode *innode,int inum)
- {
- stNode *p1,*p2;
- int node_length = 0,iRun = 0;
- node_length = Node_Length(node);
- if(node == NULL || inum > node_length || innode == NULL)
- {
- printf("链表为空或需插入的位置[%d]超过链表长度[%d]!\n",inum,node_length);
- exit(-1);
- }
- p1 = node;
- while(iRun++ < inum)
- {
- p2 = p1;
- p1 = p1->next;
- }
- p2->next = innode;
- p2->next->next = p1;
- return node;
- }
- //更新链表数据
- stNode *Node_Update(stNode *node,stNode *upnode,int inum)
- {
- stNode *p1;
- int node_length = 0,iRun = 0;
- node_length = Node_Length(node);
- if(node == NULL || inum > node_length || upnode == NULL)
- {
- printf("链表为空或需插入的位置[%d]超过链表长度[%d]!\n",inum,node_length);
- exit(-1);
- }
- p1 = node;
- while(iRun++ < inum-1)
- {
- p1 = p1->next;
- }
- strcpy(p1->sname,upnode->sname);
- p1->iage = upnode->iage;
- return node;
- }
- //链表逆序
- stNode *Node_Reverse(stNode *node)
- {
- stNode *next,*prev;
- prev = NULL;
- while(node)
- {
- next = node->next;
- node->next = prev;
- prev = node;
- node = next;
- }
- return prev;
- }
- //递归算法逆序链表
- stNode *Node_Reverse2(stNode *node)
- {
- stNode *NewHead;
- if(node == NULL || node->next == NULL)
- return node;
- NewHead = Node_Reverse2(node->next);
- node->next->next = node;
- node->next = NULL;
- return NewHead;
- }
- //销毁链表
- stNode *Node_Destroy(stNode *node)
- {
- stNode *pnode;
- while(node)
- {
- pnode = node->next;
- free(node);
- node = pnode;
- }
- return node;
- }
- int main()
- {
- stNode *p,*q,*pn1,*pn2;
- int iLength = 0;
- int iDelete = 0;
- int iInsert = 0;
- int iUpdate = 0;
-
- printf("开始创建链表\n");
- printf("输入需要创建链表的大小:");
- scanf("%d",&iLength);
- p = create(iLength);
- myprint(p);
- printf("输入需要删除的链表位置:");
- scanf("%d",&iDelete);
- Node_Delete(p,iDelete);
- myprint(p);
- q = (stNode *)malloc(stLen);
- printf("输入需要插入的位置和姓名年龄:\n");
- scanf("%d%s%d",&iInsert,&q->sname,&q->iage);
- Node_Insert(p,q,iInsert);
- myprint(p);
- pn1 = (stNode *)malloc(stLen);
- printf("输入需要修订的链表位置和姓名年龄:\n");
- scanf("%d%s%d",&iUpdate,&pn1->sname,&pn1->iage);
- Node_Update(p,pn1,iUpdate);
- myprint(p);
- printf("现在开始逆序输出链表:\n");
- //pn2 = Node_Reverse(p);
- pn2 = Node_Reverse2(p);
- myprint(pn2);
- printf("开始销毁链表:\n");
- Node_Destroy(pn2);
- myprint(pn2);
- free(p);
- free(q);
- free(pn1);
- free(pn2);
- return 0;
- }
复制代码 |
|