本帖最后由 lniwn 于 2011-8-19 11:17 编辑
- #include<stdio.h>
- #include<stdlib.h>
- typedef struct Node
- {
- int data;
- struct Node *pNext;
- }NODE, *PNODE; //NODE等价于struct Node PNODE等价于struct Node *
- PNODE create_list(); //创建一个非循环链表
- int traverse_list(PNODE pHead); //遍历
- void sort_list(PNODE pHead, int len); //排序
- int delete_list(PNODE, int); //删除
- int insert_list(PNODE, int, int *); //插入
- char is_empty(PNODE);
- int main()
- {
- PNODE pHead = NULL;
- int len = 0;
- pHead = create_list();
- len = traverse_list(pHead);
- sort_list(pHead, len);
- delete_list(pHead, len);
- //insert_list(pHead, int, int *)
- free(pHead);
- return 0;
- }
- PNODE create_list()
- {
- PNODE pNew; //新建节点
- PNODE pTail; //表尾
- PNODE pHead; //表头
- int len;
- int i;
- pHead = (PNODE)malloc(sizeof(NODE));
- if(pHead == NULL)
- {
- printf("内存不足,程序退出!");
- exit(-1);
- }
- pHead->data = 0; //初始化头节点
- pHead->pNext = NULL;
- pTail = pHead;
- printf("请输入您需要生成的链表节点个数:len = ");
- scanf("%d",&len);
- for(i = 0; i < len; i++)
- {
- pNew = (PNODE)malloc(sizeof(NODE));
- if(pNew == NULL)
- {
- printf("内存不足,程序退出!");
- exit(-1);
- }
- printf("请输入第%d个数据:",i+1);
- scanf("%d",&pNew->data);
- pNew->pNext = NULL;
- pTail->pNext = pNew;
- pTail = pNew;
- }
- //free(pNew);
- return pHead;
- }
- int traverse_list(PNODE pHead)
- {
- PNODE p;
- int len = 0;
- p = pHead->pNext;
- while(p != NULL)
- {
- printf("%d,",p->data);
- p = p->pNext;
- len++;
- }
- if(p != pHead->pNext)
- {
- printf("\b.\n");
- printf("节点个数为%d\n",len);
- return len;
- }
- else
- return is_empty(pHead);
- }
- void sort_list(PNODE pHead, int len)
- {
- PNODE p, q;
- int i, j, t;
- for(i = 0, p = pHead->pNext; i < len - 1; ++i, p = p->pNext)
- for(j = i+1, q = p->pNext; j < len; ++j, q = q->pNext)
- {
- if(p->data > q->data)
- {
- t = p->data;
- p->data = q->data;
- q->data = t;
- }
- }
- printf("排序后链表为:\n");
- for(p = pHead->pNext; p != NULL; p = p->pNext)
- printf("%d ",p->data);
- }
- char is_empty(PNODE pHead)
- {
- if(pHead->pNext == NULL)
- {
- printf("链表为空!");
- return 1;
- }
- else
- return 0;
- }
- int delete_list(PNODE pHead, int len)
- {
- int val, n, i;
- PNODE p = pHead->pNext, q = pHead;
- printf("\n请输入要删除的元素及其位置:");
- scanf("%d %d", &val, &n);
- for(i = 1; i != n && i <= len; ++i )
- {
- p->pNext; q->pNext;
- }
- //printf("\n%d, %d, i = %d\n",p->data, q->data, i);
- if(i == n && p->data == val)
- {
- q->pNext = p->pNext; //p指向当前要删除的结点,q指向他的前驱结点
- free(p);
- }
- else
- {
- printf("输入错误,找不到对应的结点或位置!");
- return 0;
- }
- printf("您已经删除了第%d个结点%d!\n", n, val);
- return 1;
- }
复制代码 东西有点长,其实其余的不用看,只看delete_list函数就行。delete_list函数中p, q都是指针,pHead为链表头指针,关键是那个for循环,循环体执行不了,每次都只是i的值变化,p, q就不动。求解! |